
使用 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之旅(六)协议与扩展所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)