PRotocol Pet { var name: String {get set} var birthPlace: String {get} func playWith() func fed() mutating func changeName(name: String)}struct Dog: Pet { internal mutating func changeName(name: String) { // 結構體加上mutating self.name = name } var name: String = "dog" var birthPlace: String = "china" func fed() { print("fed me") } internal func playWith() { print("play with me") }}協議里定義的方法和屬性要全部實現
var dog:Dog = Dog()dog.birthPlace = "beijing"var pet:Pet = Dog()pet.birthPlace = "beijing"再看上面的代碼,前兩行聲明一個Dog類型的實例,可以修改其birthPlace,后面兩行聲明的是一個Pet類型的實例,不能修改其birthPlace,因為在Pet協議里birthPlace是只讀的可以看出,雖然Dog類實現了Pet協議,但協議規定的只讀屬性發生了改變。協議里聲明構造函數:
protocol Pet { var name: String {get set} var birthPlace: String {get} func playWith() func fed() init(name: String) mutating func changeName(name: String)}class Animal { var legs: Int = 4 var name: String = "i am a animal" init(name: String) { self.name = name }}class Bird: Animal, Pet { override required init(name: String) { // override關鍵字 對應 父類animal, required 對應協議Pet super.init(name: name) } internal func changeName(name: String) { } internal func fed() { } internal func playWith() { } internal var birthPlace: String = ""}
新聞熱點
疑難解答