接口和扩展
//: Playground - noun: a place where people can play import UIKit //使用 protocol 来声明一个接口。 protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() } //类、枚举和结构体都可以实现接口。 class SimpleClass: ExampleProtocol { String = "A very simple class." var anotherProperty: Int = 120 func adjust() { simpleDescription += " Now 100% adjust." } func add() { simpleDescription += " Now 50% add." } } var a = SimpleClass() a.adjust() let aDescription = a.simpleDescription struct SimpleStructure: ExampleProtocol { String = "A aimple structure" func adjust() { simpleDescription += " (adjusted)" } } var b = SimpleStructure() b.adjust() let bDescription = b.simpleDescription enum SimpleEnum: ExampleProtocol { case First(String),Second(String),Third(String)
String { get{ switch self { case let .First(text): return text let .Second(text): let .Third(text): default: return "get error" } } set { self = .First(newValue) self = .Second(newValue) self = .Third(newValue) } } }
func adjust() { self { let .First(text): self = .First(text + " (first case adjust)") let .Second(text): self = .Second(text + " (Second case adjust)") let .Third(text): self = .Third(text + " (Third case adjust)") } } } var c = SimpleEnum.First("FirstVal") c.simpleDescription c.adjust() c.simpleDescription var d = SimpleEnum.Second("Hello") var text = d.simpleDescription d.simpleDescription = "Word" text = d.simpleDescription d.adjust() text = d.simpleDescription //注意声明 SimpleStructure 时候 mutating 关键字用来标记一个会修改结构体的方法。SimpleClass 的声明不需要标记 任何方法因为类中的方法经常会修改类。 //使用 extension 来为现有的类型添加功能,比如添加一个计算属性的方法。你可以使用扩展来给任意类型添加协议,甚至是你从外部库或者框架中导入的类型。 extension Int: ExampleProtocol { String { return "The number (self)" } self += 42 } } //你可以像使用其他命名类型一样使用接口名——例如,创建一个有不同类型但是都实现一个接口的对象集合。当你处理 类型是接口的值时,接口外定义的方法不可用。 let protocolValue: ExampleProtocol = a protocolValue.simpleDescription //即使 protocolValue 变量运用时的类型是 simpleClass,编译器会把它的类型当做 ExampleProtocol。这表示你不能调用类在它实现的接口之外实现的方法或者属性。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- actionscript-3 – 在Flex / AIR中:是否可以检测可移动卷的
- ruby – 在openSUSE 11.3上安装RMagick – gem无法构建其扩
- Oracle专题6之Oracle的分组函数与数组分组
- ruby-on-rails – Rails:路由前进行身份验证
- swift中通知NSNotificationCenter的使用
- c# – 如何重新使用现有/已打开的Windows资源管理器窗口来启
- [转]:xmake依赖包的添加和自动检测机制
- c# – 如何获取程序集的名称空间而不是其依赖项?
- c# – Entity Framework中的SaveChanges vs SaveChangesAsy
- 如何从C#中的设置文件传递字符串文字