//协议,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()
- 协议描述了一个遵循它的类型应该拥有的属性和方法,但并不提供那- 些方法的实现。
- 你可以基于协议创建协议,这一点跟类相似。
- 扩展允许你为类型添加方法和计算属性。
- 协议扩展是为协议添加方法和计算属性。
- 面向协议编程是这样一种实践:它把程序架构按照一系列协议来设计,然后利用协议扩展来提供默认实现
网友评论