在扩展里添加协议遵循
下面代码是伪代码 不能执行 知识为了帮助理解
你可以扩展一个已经穿在的类型来采纳和遵循一个新的协议,旧算时你无法访问现有的类型的源代码也行,扩展可以添加新的属性、方法、和下标到已经存在的类型。并且因此允许你添加协议需要的任何结果
//: FROM https://www.anuomob.com
import UIKit
protocol TextRepresentable{
var textualDescition:String{ get }
}
extension Dice:TextRepresentable{
var textualDescition:String{
return "A \(sides) -sided dice"
}
}
有条件地遵循协议,泛型类型可能只在某些情况下满足一个协议的要求,比如当类型的泛型形式参数遵循对应协议时。你可以通过在扩展类型时列出限制让泛型有条件地遵循某协议,在你采纳协议的名字后面写泛型where语句。
//: FROM https://www.anuomob.com
import UIKit
protocol TextRepresentable{
var textualDescition:String{ get }
}
extension Array:TextRepresentable where Element:TextRepresentable{
var textualDescition: String{
let itemAsText = self.map { $0.textualDescition}
return "["+itemAsText.joined(separator: ",")+"]"
}
}
//d6 d12 是骰子元素 暂时还未创建
let myDice = [d6,d12]
print(myDice.textualDescition)
使用扩展声明采纳协议
如果一个类型已经遵循了协议的所有需求,但是还没有声明它采纳了这个协议,你可以让通过一个空的扩展来让他采纳这个协议
//: FROM https://www.anuomob.com
import UIKit
struct Hamster{
var name:String
var textualDescription:String{
return "A hamster named\(name)"
}
}
extension Hasmster:TextRepresentable{}
协议扩展
协议可以通过扩展来提供方法和属性的实现以遵循类型,这就允许你在协议自身定义行为,而不是在每一个遵循或者在全局函数里定义
//: FROM https://www.anuomob.com
import UIKit
extension RandomNumberGenerator{
func randomBool() -> Bool{
return random() > 0.5
}
}
let generator = LinearCongruenruentialGenerator()
print(generator.random())
print(generator.randomBool())
提供默认实现
你可以使用协议扩展来给协议的任意方法或者计算属性,要求提供默认实现。如果遵循类型给这个协议的要去提供了它的实现,那么它就会代替扩展中提供的默认实现。
下面是可以运行的代码
//: FROM https://www.anuomob.com
import UIKit
protocol TextRepresentable{
var desc:String {get}
}
protocol Named{
var name:String{get}
}
protocol Aged{
var age:Int{get}
}
struct Person:Named,Aged {
var name:String
var age:Int
}
let p = Person(name: "zhangsan ", age: 32)
extension Person:TextRepresentable{
var desc:String{
return "name is \(name) ,age \(age)"
}
}
print(p.desc)
name is zhangsan ,age 32
//: FROM https://www.anuomob.com
import UIKit
protocol TextRepresentable{
var desc:String {get}
}
protocol Named{
var name:String{get}
}
protocol Aged{
var age:Int{get}
}
struct Person:Named,Aged {
var name:String
var age:Int
}
let p = Person(name: "zhangsan ", age: 32)
extension Person:TextRepresentable{
var desc:String{
return "name is \(name) ,age \(age)"
}
}
extension Array:TextRepresentable where Element:TextRepresentable{
var desc: String{
let itemDesc = self.map {$0.desc}
return itemDesc.joined(separator: ",")
}
}
let array = [Person(name: "zhangsan",age: 2),Person(name: "zhangsan2",age: 32)]
print(array.desc)
name is zhangsan ,age 2,name is zhangsan2 ,age 32
可以直接修改协议本身
//: FROM https://www.anuomob.com
import UIKit
protocol TextRepresentable{
var desc:String {get}
}
protocol Named{
var name:String{get}
}
protocol Aged{
var age:Int{get}
}
struct Person:Named,Aged {
var name:String
var age:Int
}
let p = Person(name: "zhangsan ", age: 32)
extension Person:TextRepresentable{
var desc:String{
return "name is \(name) ,age \(age)"
}
}
extension Collection where Iterator.Element:TextRepresentable{
var desc: String{
let itemDesc = self.map {$0.desc}
return itemDesc.joined(separator: ",")
}
}
let array = [Person(name: "zhangsan",age: 2),Person(name: "zhangsan2",age: 32)]
print(array.desc)