俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

协议

 

 

/** 协议 **/

 

//// 1.定义协议

 

//格式:协议的定义方式与类, 结构体, 枚举的定义非常相似

protocol SomeProtocol {

    //协议方法

}

 

//协议可以继承一个或者多个协议

protocol SomeProtocol2:SomeProtocol {

    //协议定义

}

 

//结构体实现协议

struct SomeStrure : SomeProtocol,SomeProtocol2 {

    //结构体定义

}

 

//类实现协议和继承父类, 协议一般卸载父类后面

class SomeSuperclass {

    //父类定义

}

class SomeClass: SomeSuperclass, SomeProtocol{

    

    //子类定义

}

 

//// 2.协议的属性

// 协议不指定是否该属性应该是一个存储属性或者计算属性, 它只指定所需的名称和读写类型. 属性要求总是声明为变量属性, 用var关键字做前缀.

 

protocol ClassProtocol {

    static var present:Bool { get set}    //要求该属性可读可写,并且是静态的

    var subject:String { get }            //要求改属性可读

    var stName:String { get set}          //要求该属性可读可写

}

 

//定义类来实现协议

class MyClass : ClassProtocol {

    static var present = false     //如果没有实现协议的属性要求,会直接报错

    var subject = "Swift Protocol" //该属性设置为可读可写, 也是满足协议的要求

    var stName: String = "Class"

    

    func attendance() -> String {

        return "The (self.stName) has secured 99% attendance"

    }

    

    func markSScured() -> String {

        return "(self.stName) has (self.subject)"

    }

}

//创建对象

var classa = MyClass()

print(classa.attendance())  // The Class has secured 99% attendance

print(classa.markSScured()) // Class has Swift Protocol

 

//// 3.协议普通方法实现

// 协议可以要求制定实例方法和类型方法被一致的类型实现. 这些方法被写为定义协议的一部分, 跟普通实例和类型方法完全一样, 但是没有大括号或方法体. 可变参数是允许的, 普通方法也遵循同样的规则, 不过不允许给协议方法参数指定默认值.

 

//定义协议, 指定方法要求

protocol RandomNumberGenerator {

    func random() -> Double  //实现该协议, 需要实现该方法

}

 

class LinerCongruentialGenerator : RandomNumberGenerator {

    var lastRandom = 45.0

    let m = 149998.0

    let a = 24489.0

    let c = 29879.0

    

    // 实现协议方法

    func random() -> Double {

        lastRandom = ((lastRandom * a + c).truncatingRemainder(dividingBy: m)) //truncatingRemainder 替代旧方法 %

        return lastRandom / m

    }

}

 

let generator = LinerCongruentialGenerator()

print("随机数:(generator.random())")    //随机数:0.545993946585954

print("再来随机数:(generator.random())") //再来随机数:0.0449539327191029

 

 

//// 4.协议中实现构造函数

// 协议SomeProtocol中不仅可以声明方法/属性/下标, 还可以声明构造器, 但在Swift中, 除了某些特殊情况下, 构造器是不被子类继承的, 所以SomeClass中虽然能保证定义了协议要求的构造器, 但不能保证SomeClass的子类中也定义了协议要求的构造器. 所以我们需要在实现协议要求的构造器时, 使用required关键字确保SomeClass的子类也得实现这个构造器.

 

protocol TcpProtocol {

    // 初始化构造器要求

    init(aprot:Int)

}

 

class TcpClass: TcpProtocol {

    var aprot: Int

    required init(aprot: Int) {

        self.aprot = aprot

    }

}

 

var tcp = TcpClass(aprot: 20)

print(tcp.aprot)

 

 

// 例子: 举个简单的例子,有一只猫和狗,他们都属于宠物,用类去实现就要这样操作,定义一个父类叫做宠物,里面有喂食和玩耍两个方法,猫和狗都继承与宠物这个父类。这样操作自然可以实现,但是要知道,猫和狗不都是宠物,这里把宠物定义成父类就不是很合适,这里应该把宠物定义成协议就相对合适很多啦

 

//// 5.使用实例

// 宠物猫和宠物狗的例子,利用协议可以这样实现,声名个动物的父类,然后让猫和狗class都继承与动物class。在定义一个宠物的属性,里面有玩耍和喂食两个方法,让猫和狗都继承与宠物协议,实现代码如下:

 

protocol Pet {

    func payWith()

    func fed(food:String)

}

 

class Animal {

    var name:String = ""

    var birthPlace:String = ""

    init(name:String, birthPlace:String) {

        self.name = name

        self.birthPlace = birthPlace

    }

}

 

class Dog: Animal, Pet {

    func payWith() {

        print("

本文由俄罗斯贵宾会发布于编程,转载请注明出处:协议

您可能还会对下面的文章感兴趣: