轉載自:http://www.jianshu.com/p/14cc9d30770a 感謝作者:此ID想了很久
Swift中protocol的功能比OC中強大很多,不僅能再class中實現,同時也適用於struct
、enum
。
使用 mutating 關鍵字修飾方法是為了能在該方法中修改 struct 或是 enum 的變量,在設計接口的時候,也要考慮到使用者程序的擴展性。所以要多考慮使用mutating來修飾方法。
首先,先定義一個protocol
protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() }
在上面,定義了一個ExampleProtocol
,接下來我們寫一個class來遵守這個協議
class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class" var anotherProperty: Int = 110 // 在 class 中實現帶有mutating方法的接口時,不用mutating進行修飾。因為對於class來說,類的成員變量和方法都是透明的,所以不必使用 mutating 來進行修飾 func adjust() { simpleDescription += " Now 100% adjusted" } } // 打印結果 var a = SimpleClass() a.adjust() let aDescription = a.simpleDescription
在 struct
中實現協議ExampleProtocol
struct SimpleStruct: ExampleProtocol { var simpleDescription: String = "A simple structure" mutating func adjust() { simpleDescription += "(adjusted)" } }
在enum
中實現協議ExampleProtocol
enum SimpleEnum: ExampleProtocol { case First, Second, Third var simpleDescription: String { get { switch self { case .First: return "first" case .Second: return "second" case .Third: return "third" } } set { simpleDescription = newValue } } mutating func adjust() { } }
錯誤信息
如果將ExampleProtocol
中修飾方法的mutating去掉,編譯器會報錯說沒有實現protocol。如果將struct中的mutating去掉,則會報錯不能改變結構體的成員。