swift协议基础

swift协议定义方法(不能有默认参数)和属性(不能是let常量且必须表明读取属性)列表。一个类或者结构体遵守协议,就必须申明协议中规定的属性(这里的属性只需要与协议中规定的属性同名同类型即可,不需要有相同的读取属性),实现协议中规定的方法。
1、swift中的继承是单一的,也就是说一个类只能继承一个类,所以swift语法要求如果一个类要继承,又要遵守协议,那么书写方式应该是这样的class 类名:要继承的父类,...要遵守的协议列表
2、协议中也可以定义构造函数,如果一个类遵守的协议和继承的父类都需要实现同一个方法,那么就需要同时使用requiredoverride
3、协议中的如果需要对属性的类型别名typealiasassociatedtype是同一个意思,类型别名,只不过苹果为了区别要求类型别名关键字typealiasassociatedtype替换,属于协议专用的,表明遵守协议的类型,必须定义一个同名的类型别名,而在协议实现时定义这个类型别名还是使用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可以为协议提供默认实现
在协议的扩展中,我们可以直接为协议方法提供默认实现,为协议中的属性(计算型属性)添加默认实现,同样可以给协议添加方法和计算属性,并提供默认实现;在扩展中添加的方法和属性,必须提供默认实现。如果遵守协议的类或者结构体没有实现协议规定的方法,那么直接使用扩展中的默认方法实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容