ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Swift 协议 Protocol ``` protocol Pet{ // 对于属性,不能有初始值 var name: String{ get set }// = "My Pet" // 统一使用var关键字 var birthPlace: String{ get } // 对于属性,get,set隐藏了实现细节,可以使用let实现只读,也可以使用只有get的计算型属性 // 对于方法,不能有实现 func playWith() // 对于方法,不能有默认参数(默认参数就是一种实现) //func fed(food: String = "leftover") func fed() func fed(food: String) // 可以使用mutating关键字,强调这个方法应该修改其内容 mutating func changeName(newName:String) // 不可以设置访问控制 // 协议就是协议,如果开发者可以看见协议,就可以看见协议里的任何内容 } // 不能实例化Pet //var pet = Pet() // 协议的继承 protocol PetBird: Pet{ var flySpeed: Double{ get } var flyHeight: Double{ get } } // 协议的实现,实现协议规定的所有属性和方法即可 struct Dog: Pet{ // 可以使用计算型属性 // private var myDoggyName = "Puppy" // var name: String{ // get{ // return myDoggyName // } // set{ // myDoggyName = newValue // } // } var name: String // protocol的read-only,对一个具体类的实现,不一定只读,但是作为Pet是只读的! //let birthPlace: String var birthPlace: String func playWith() { print("Wong!") } func fed(){ print("I want a bone.") } // 在具体实现上可以加默认参数 func fed(food: String = "Bone"){ if food == "Bone"{ print("Happy") } else{ print("I want a bone") } } // 对于class,不需要mutating关键字 mutating func changeName(newName: String) { name = newName } } let myDog:Dog = Dog(name: "summer", birthPlace: "beijing") // 从 Pet 的角度看,myDog 的 birthPlace 是只读的! let aPet: Pet = myDog //aPet.birthPlace = "shanghai" ``` ``` protocol Pet{ var name: String{ get set } init(name: String) func playWith() func fed() } class Animal{ var type: String = "mammal" } // 如果一个类有继承的类,则父类必须放在前面 class Dog: Animal, Pet{ // 如果protocol没有init(name)的要求,name有默认名字就够了 var name: String = "Puppy" // 如果 protocol 有 init ,则在 class 中必须注明 required required init(name: String){ self.name = name } func playWith() { print("Wong") } func fed(){ print("I love bones") } } final class Cat: Animal, Pet{ var name: String = "Kitten" // 如果是final class, init 可以没有 required , 因为也不会再被继承了 init(name: String){ self.name = name } func playWith() { print("Meow") } func fed(){ print("I love fish") } } class Bird: Animal{ var name: String = "Little Little Bird" init(name: String){ self.name = name } } // 如果只是继承 Bird ,Bird 的 init 为 required ,则 override 可以省略 // 否则,必须有 override , 可以没有 required // 因为有 Pet ,则 required 也不能省 class Parrot: Bird, Pet{ required override init(name: String){ super.init( name: name + " " + name ) } func playWith() { print("Hello") } func fed(){ print("Thank you!") } } ```