// 协议中虽然可以指定属性的读写,但即使协议中规定属性是只读的但在使用时也可以将其实现成可读写的; // Swift的协议中可以约定属性是实例属性还是类型属性、是读写属性还是只读属性,但是不能约束其是存储属性还是计算属性; // 协议中的类型属性和类型方法使用static修饰而不是class(尽管对于类的实现中类型属性、类型方法使用class修饰); // 协议中约定的方法支持可变参数,但是不支持默认参数; // 协议中约定的构造方法,在实现时如果不是final类则必须使用require修饰(以保证子类如果需要自定义构造方法则必须覆盖父类实现的协议构造方法,如果子类不需要自定义构造方法则不必); // 一个协议可以继承于另外一个或多个协议,一个类只能继承于一个类但可以实现多个协议; // 协议本身就是一种类型,这也体现除了面向对象的多态特征,可以使用多个协议的合成来约束一个实例参数必须实现某几个协议; // { //Person遵循Named协议 class Person:Named{ //注意从Named 协议中并不知道name是存储属性还是计算属性 var name: String var age:Int = 0 static var className: String{ return"Person" } //协议中规定的构造方法,必须使用required关键字声明 required init(name:String){ self.name = name } //遵循showName方法 func shoName() { print("name=(name)") } //遵循showClassName方法 static func showClassName() { print("Class name is "Person"") } } class Student:Person,Scored{ var score: Double = 0.0 init (name:String,score:Double){ self.score = score super.init(name: name) } required init(name:String){ super.init(name: name) } override func shoName() { print("协议的方法") } func test(){ print("(self.name)is test") } } let p = Person(name:"Kenshin") p.shoName() print("className=(Person.className)") Person.showClassName() p.age = 28 let s:Named = Student(name:"test",score: 100.0) s.shoName() } protocol Named{ var name:String{ get set } //定义一个类型属性 static var className:String{ get } //定义构造方法 init(name:String) //定义一个实例方法 func shoName() //定义一个类型方法 static func showClassName() } protocol Scored{ var score:Double { get set } }