0
点赞
收藏
分享

微信扫一扫

swift 协议和扩展

at小涛 2023-03-10 阅读 85


在扩展里添加协议遵循

下面代码是伪代码 不能执行 知识为了帮助理解

你可以扩展一个已经穿在的类型来采纳和遵循一个新的协议,旧算时你无法访问现有的类型的源代码也行,扩展可以添加新的属性、方法、和下标到已经存在的类型。并且因此允许你添加协议需要的任何结果

//: 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)

 

举报

相关推荐

0 条评论