swift协议定义方法
(不能有默认参数)
和属性(不能是let常量且必须表明读取属性)
列表。一个类或者结构体遵守协议,就必须申明协议中规定的属性(这里的属性只需要与协议中规定的属性同名同类型即可,不需要有相同的读取属性)
,实现协议中规定的方法。
1、swift中的继承是单一的,也就是说一个类只能继承一个类,所以swift语法要求如果一个类要继承,又要遵守协议,那么书写方式应该是这样的class 类名:要继承的父类,...要遵守的协议列表
2、协议中也可以定义构造函数,如果一个类遵守的协议和继承的父类都需要实现同一个方法,那么就需要同时使用required
和override
3、协议中的如果需要对属性的类型别名typealias
和associatedtype
是同一个意思,类型别名,只不过苹果为了区别要求类型别名关键字typealias
用associatedtype
替换,属于协议专用的,表明遵守协议的类型,必须定义一个同名的类型别名,而在协议实现时定义这个类型别名还是使用typealias
关键字,associatedtype
只会出现在协议中
///class和struct都能实现的协议
///mutating用于修饰结构题的方法,表明方法可以修改结构体自身,对于class是没有意义的。对于可能修改自身的方法就需要考虑用mutating修饰
protocol Animal
{
//类型别名
associatedtype AnimalType;
//可读可写的属性
var name:String {get set}
//只读的属性
var age:Int {get}
func eat();
mutating func changeName();
}
///只有class实现的协议
protocol Plant
{
//类型别名
associatedtype PlantType;
//可读可写的属性
var name:String {get set}
//只读的属性
var age:Int {get}
func eat();
}
4、协议的扩展extension
可以为协议提供默认实现
在协议的扩展中,我们可以直接为协议方法提供默认实现,为协议中的属性(计算型属性)添加默认实现,同样可以给协议添加方法和计算属性,并提供默认实现;在扩展中添加的方法和属性,必须提供默认实现
。如果遵守协议的类或者结构体没有实现协议规定的方法,那么直接使用扩展中的默认方法实现
网友评论