本篇分為兩部分: 一、Swift 中 protocol 組合的使用 二、Swfit 中 static和class 的使用 一、Swift 中 protocol 組合的使用 在 Swift 中我們可以使用 Any 來表示任意類型(public typealias Any = protocol<>),是 ...
本篇分為兩部分:
一、Swift 中 protocol 組合的使用
二、Swfit 中 static和class 的使用
一、Swift 中 protocol 組合的使用
在 Swift 中我們可以使用 Any 來表示任意類型(public typealias Any = protocol<>),是一個 protocol<>的同名類型,需要實現空介面的介面,其實就是任意類型的意思。
protocol<ProtocolA, ProtocolB, ProtocolC> 等價於 protocol ProtocolD: ProtocolA, ProtocolB, ProtocolC { //... }
protocol 組合可以用 typealias 來命名的,於是上面的 ProtocolD 協議可以替換為
typealias ProtocolAll = protocol<ProtocolA, ProtocolB, ProtocolC>
如果某些介面我們只用一次的話,可以直接匿名化
struct ProtocolStruct { static func test1(pro: protocol<ProtocolA, ProtocolB>) { //... } static func test2(pro: protocol<ProtocolB, ProtocolC>) { //... } }
如果實現多個介面時介面內的方法衝突的話只要在調用前進行類型轉換就可以了
protocol A { func wang() -> Int } protocol B { func wang() -> String } class AnClass: A, B { func wang() -> Int { return 0 } func wang() -> String { return "強轉" } } let instance = AnClass() let num = (instance as A).wang() let str = (instance as B).wang()
二、Swfit 中 static和class 的使用
在 Swift1.2及以後,我們可以在 class 中使用 static 來聲明一個類作用域的變數:
class MyClass { static var bar: AnClass? }
這種寫法是合法的,有了這個特性之後,像單例的寫法就很簡單了
protocol MyProtocol { static func foo() -> String } struct MyStruct: MyProtocol { static func foo() -> String { return "MyStruct" } } enum MyEnum: MyProtocol { static func foo() -> String { return "MyEnum" } } class TestClass: MyProtocol { // 在 class 中可以使用 class class func foo() -> String { return "TestClass.foo()" } // 也可以使用 static static func bar() -> String { return "AnClass.bar()" } }
protocl 是比較特殊的,在 Swift 中 class, struct 和 enum 都是可以實現某個 protocol 的,這時候我們就會不知道在什麼情況下使用 static,什麼情況下使用 class。在 Swift2.0 之後,只要記住在任何時候使用 static 都是沒有問題的。