swift 协议和扩展

在扩展里添加协议遵循

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

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

//: 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值