Swift之旅(六)协议与扩展

Swift之旅(六)协议与扩展,第1张

概述使用 protocol 来定义一个协议。 protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust()} 类、枚举和结构体都可以接受协议。 class SimpleClass: ExampleProtocol { var simpleDescription:

使用 protocol 来定义一个协议。

protocol ExampleProtocol {    var simpleDescription: String { get }    mutating func adjust()}

类、枚举和结构体都可以接受协议。

class SimpleClass: ExampleProtocol {    var simpleDescription: String = "A very simple class."    var anotherProperty: Int = 69105    func adjust() {        simpleDescription += " Now 100% adjusted."    }}var a = SimpleClass()a.adjust()let aDescription = a.simpleDescriptionstruct SimpleStructure: ExampleProtocol {    var simpleDescription: String = "A simple structure"    mutating func adjust() {        simpleDescription += " (adjusted)"    }}var b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription

试一试

写一个遵循该协议的枚举。

注意SimpleStructure里使用了 mutating 关键字标记了一个修改结构体的方法。SimpleClass的定义里不需要任何方法标记为mutating,因为类中的方法总是会修改这个类的。

使用 extension 来为已经存在的类增加功能,比如新方法和计算过的属性。你可以用 extension 给那些定义在别的地方的类型增加协议遵循,甚至可以加到导入的类库或者框架的类型中。

extension Int: ExampleProtocol {    var simpleDescription: String {        return "The number \(self)"    }    mutating func adjust() {        self += 42    }}println(7.simpleDescription)

试一试

为Double类型写一个扩展,增加一个 absoluteValue 属性。

你可以像其它任何命名类型那样使用协议名——例如,要创建一个对象集合,对象的类型都不一样,不过都遵循一个单独的协议。当遇到类型为协议类型的值时,协议定义以外的方法是不可用的。

let protocolValue: ExampleProtocol = aprintln(protocolValue.simpleDescription)// println(protocolValue.anotherProperty) // 取消注释看看会有什么错误

即使变量 protocolValue 运行时类型是 SimpleClass,编译器还是把它当作给定的 ExampleProtocol 类型。这说明除了协议里定义的,你没法访问到类实现的方法和属性。

总结

以上是内存溢出为你收集整理的Swift之旅(六)协议与扩展全部内容,希望文章能够帮你解决Swift之旅(六)协议与扩展所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1087880.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存