2020-11-10协议和拓展

2020-11-10  本文已影响0人  脑子
//协议,Identifiable协议要求所有遵循协议的类型必须有一个 id 字符串属性,并且这个字符串可读写。
protocol Identifiable {
    var id: String { get set
    }
}
//遵循协议的结构体
struct User: Identifiable {
    var id: String
}
func displayID(thing: Identifiable){
    print("My ID is \(thing.id)")
}

//协议继承
protocol Payable {
    func calculateWages() -> Int
}
protocol NeedsTraining {
  func study()
}
protocol HasVacation {
  func takeVacation(days: Int)
}
//创建一个 Employee 协议,将上面的三个协议合并在一起,
//现在我们就可以创建遵循这个单一协议的类型,而不是分别遵循三个协议的类型
protocol Employee: Payable, NeedsTraining,HasVacation{}

扩展

//扩展使得你可以为已经存在的类型添加方法,实现它们设计时没有做的事情
extension Int{
    func squared() -> Int {
        return self * self
    }
}
let number = 9
number.squared()

//Swift不允许你通过扩展添加存储属性,但可以用扩展添加计算属性
extension Int{
    var isEven: Bool{
        return self % 2 == 0
    }
}
//协议扩展
let pythons = ["ben","ben","lang","zai","chi","fan"]
let beatlse = Set(["John","Paul","George","Ringo"])
//Swift的数组和集合都遵循一个叫 Collection 的协议,因此可以给 Collection 协议扩展一个叫 summarize() 的方法,这个方法逐一打印collection里的元素
extension Collection {
    func summarize(){
        print("There are \(count) of us:")
        for name in self {
            print(name)
        }
    }
}
pythons.summarize()
beatlse.summarize()

//面向协议编程
//协议扩展可以为我们自己的协议方法提供默认实现
protocol Identifibale{
    var id: String {get set}
    func identify()
}

extension Identifiable {
    func identify(){
        print("My ID is \(id)")
    }
}
//再声明一个遵循 Identifiable 协议的类型时,它会自动获得 identify() 方法的实现
struct User: Identifiable{
    var id: String
}

let paul = User(id: "Paul")
paul.identify()


上一篇下一篇

猜你喜欢

热点阅读