Swift专题讲解二十一——协议

Swift专题讲解二十一——协议

1、引言

        协议约定了一些属性与方法,其做用相似Java中的抽象类,Swift中类型经过遵照协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议能够经过扩展来实现一些方法和附加功能。javascript

2、在协议中定义属性和方法

        协议中定义的属性只约定名称和类型,在具体类型的实现中,其能够是存储属性也能够是计算属性,协议中还须要指定属性是可读的仍是可读可写的。示例代码以下:java

protocol MyPortocol {
    //定义实例属性
    //可读的
    var name:String{get}
    //可读可写的
    var age:Int{set get}
    //可读的
    var nameAndAge:String{get}
    static var className:String{get}
}
class MyClass: MyPortocol {
    var name: String
    var age: Int
    var nameAndAge: String{
        get{
            return "\(name)"+"\(age)"
        }
    }
    static var className: String{
        get{
            return "MyClass"
        }
    }
    init(){
        name = "HS"
        age = 24
    }
}

有一点须要注意,协议中的可读并非只读,协议中的属性约定成可读可写,则在实现时,这个属性必须是可读可写的,可是若是协议中约定成可读的,则此属性能够是只读的也能够是可读可写的,看具体的实现。函数

        协议中约定的方法能够是实例方法也能够是类型方法,示例以下:spa

protocol MyPortocol {
    func logName()
    static func logClassName()
}
class MyClass: MyPortocol {
    var name: String
    var age: Int
    init(){
        name = "HS"
        age = 24
    }
    func logName() {
        print(name)
    }
    static func logClassName() {
        print(className)
    }
}

一样,协议中也能够对构造方法进行定义约定。code

3、协议的特色

        协议中虽然没有任何属性和方法的实现,可是其仍然能够当作类型来使用,在函数参数、返回值中应用普遍,示例以下:继承

protocol MyPortocol {
    //定义实例属性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    static func logClassName()
}
//将协议类型做为参数
func test(param:MyPortocol)  {
    param.logName()
}

协议做为类型这种用法另外一个应用点是在集合类型中,协议能够做为全部遵照此协议的集合类型。ip

        协议能够像其余类型同样进行继承,子协议将自动拥有父协议约定的属性和方法。协议也能够经过class关键字来定义只有类能够进行遵照,示例以下:get

protocol MyPortocol {
    //定义实例属性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    static func logClassName()
}
//只有类能够继承此协议
protocol MySubPortocol:class,MyPortocol {
    
}

        协议既然能够像其余类型同样进行使用,固然它也可使用is,as?,as!进行检查和转换,关于is,as的更多用法能够查看Swift关于类型转换的内容。it

        协议也可定义其中的属性或方法为可选的,即遵照此协议的类能够实现也能够不实现可选的属性和方法,然而,声明为可选的须要此协议为@objc类型的,示例以下:io

@objc protocol MyPortocol {
    //定义实例属性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    //可选实现
    optional static func logClassName()
}

        Swift中的协议还有一个十分重要的特性,其能够经过扩展来进行属性、方法以及下标的实现。这对于一些通用类的方法十分方便,这至关于全部继承此协议的类都默认实现了这样的方法,示例以下:

protocol MyPortocol {
    //定义实例属性
    var name:String{get}
    var age:Int{set get}
    var nameAndAge:String{get}
    static var className:String{get}
    func logName()
    static func logClassName()
}
extension MyPortocol{
    var name:String{
        return "HS"
    }
}

专一技术,热爱生活,交流技术,也作朋友。

——珲少 QQ群:203317592

相关文章
相关标签/搜索