2014-11-04 34 views
1

在斯威夫特我可以這樣寫:你怎麼能動態測試自我類型和類型無關

func id(_: Any) -> Int? { 
    return nil 
} 
func id<T: Hashable>(hashable: T) -> Int? { // Weird, what's T needed for? Why not "func id(hashable: Hashable) -> Int? {"? 
    return hashable.hashValue 
} 
func id(object: AnyObject) -> Int? { 
    return reflect(object).objectIdentifier?.hashValue 
} 

然而上述選擇id函數來調用基於靜態(聲明)的參數類型。我真想所使用的實際運行時類型的動態版本,即我真的想:

func dynamicId(anything: Any) -> Int? { 
    switch anything { 
    case let hashable as Hashable: 
     return hashable.hashValue 
    case let object as AnyObject: 
     return reflect(object).objectIdentifier?.hashValue 
    } 
    return nil 
} 

的問題是,這兩個「案例讓... ...爲:」線被編譯器拒絕。兩行具有錯誤:

  • 從低迷現狀「任意」無關型...

另外的第一行有錯誤:

  • 協議「可哈希」只能被用作通用約束條件,因爲它具有自我或相關類型要求

這些錯誤對我來說似乎有點受到限制,因爲我正在測試一種類型,而不是無條件地轉換爲類型。

任何提示,我可能會寫這個?

在此先感謝 - 霍華德。

回答

0

Apple's Swift Language Guide

You can check for protocol conformance only if your protocol is marked with the @objc attribute.

HashableAnyObject不@objc協議,所以你想做什麼,似乎不支持。

+0

是的,動態功能目前是有限的。我希望有人有一個好主意如何做到這一點:) – 2014-11-04 01:23:22

+0

哎呀,意思是說,AnyObject的歸屬與@objc,但它仍然被拒絕:(但完全同意,Hashable是永遠不會工作。挑選集體大腦,看看我是否錯過了一些東西。 – 2014-11-04 01:28:04