2016-09-28 45 views
0

一個更具體的I型做一個協議:低迷現狀任何在迅速

protocol TestProtocol { 
    func test() -> Int 
} 

和我延伸INT和可選符合的協議:

extension Int: TestProtocol { 
    func test() -> Int { 
     return 1 
    } 
} 

extension Optional where Wrapped: TestProtocol { 
    func test() -> Int { 
     switch self { 
     case let value?: 
      return value.test() 
     default: 
      return 0 
     } 
    } 
} 

我還可以延伸字符串,雙和其他類型符合這個協議。

如果我給了特定類型的變量,它的工作原理確定:

let fff: Int? = 2 
print(fff.test()) 

但是,如果變量類型是任何:

let kkk: Any = fff 
print(kkk.test()) 

如何檢查KKK的真實類型符合的協議TestProtocol並獲得結果。

+0

在這個例子中,'Optional'不符合'TestProtocol'。當'Optional'包裝符合的東西時,它有一個'test()'方法,但這對於'Optional'本身來說是不夠的。 Swift中沒有條件一致性。你不能說「如果它們的元素是可平衡的,則數組是可平衡的」。有關更多信息,請參閱https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-。 –

+0

謝謝!你解決了我的問題! – leizh00701

回答

1

使用另購的結合:

let kkk: Any = 42 // Actually an Int 
if let k = kkk as? TestProtocol { 
    print(k.test()) 
} else { 
    print("kkk does not conform to TestProtocol") 
}