2016-04-05 45 views
1

爲什麼這個函數不能編譯?抱怨是:二元運算符'==='不能用於I.Type和T.Type類型的操作數。編譯器不會讓我比較類型

func checkTypeOf<I, T>(instance: I, type: T.Type) { 
     print("\(instance) \(I.self === type ? "is" : "is not") a \(type)") 
    } 

相反,這裏是編譯並運行了一個例子:

class Dog { 
    @objc static var whatADogSays : String = "woof" 
} 
class NoisyDog : Dog { 
} 

func typeTester(d:Dog, _ whattype:Dog.Type) { 
    print("The \(d.dynamicType) \(d.dynamicType === whattype ? "is" : "is not") a \(whattype)") 
} 

typeTester(NoisyDog(), Dog.self) 

回答

1

您可能需要的參數來約束作爲AnyType ===僅適用於AnyObject。

func checkTypeOf<I: AnyObject, T: AnyObject>(instance: I, type: T.Type) { 
    print("\(instance) \(I.self === type ? "is" : "is not") a \(type)") 
} 

這裏是===運營商是如何定義的

@warn_unused_result 
public func ===(lhs: AnyObject?, rhs: AnyObject?) -> Bool 
+0

這聽起來並不正確。查看我添加到我的問題中的對比例。 – Verticon

+0

等一下;現在我懂了。如果沒有AnyObject約束,T和I可以是結構或枚舉;無法應用===運算符。 – Verticon

+0

非常適合你!你能提出答案嗎? – mohamede1945