swift协议基础

2017-02-21  本文已影响96人  天蚕

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可以为协议提供默认实现
在协议的扩展中,我们可以直接为协议方法提供默认实现,为协议中的属性(计算型属性)添加默认实现,同样可以给协议添加方法和计算属性,并提供默认实现;在扩展中添加的方法和属性,必须提供默认实现。如果遵守协议的类或者结构体没有实现协议规定的方法,那么直接使用扩展中的默认方法实现

上一篇 下一篇

猜你喜欢

热点阅读