Swift3.0学习笔记-Extensions
来源:互联网 发布:ipad热点无法加入网络 编辑:程序博客网 时间:2024/05/03 21:04
https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html#//apple_ref/doc/uid/TP40014097-CH24-ID151
跟其它语言不同, Swift还支持扩展类、结构体、枚举和协议类型的能力, 不再需要定义派生数据结构。
Swift扩展支持:
1、添加实例成员变量和数据类型;
2、定义成员方法和静态方法(前缀是否带static关键字);
3、定义新的构造函数;
4、定义下标脚本;
5、新定义和使用嵌套数据类型;
6、将数据类型转换为协议类型;
备注:Extension可以新增函数, 但不能覆盖原有函数。
跟闭包类型, 扩展的语法是数据类型后面跟着{} 。 如:
extension SomeType { // 代码}
Swift还支持对接口的扩展, 跟Java一样,Swift是单继承并可实现若干个接口。SomeProtocol和AnotherProtocol是接口数据类型。
extension SomeType: SomeProtocol, AnotherProtocol { // 实现接口类的函数}
上面是2种定义扩展的基本语法。
注意: 扩展声明后所有的该数据类型都支持其提供的能力,不管扩展代码写在调用的前面或后面都可以。
添加数据类型的属性:
extension Double { var km: Double { return self * 1_000.0 } //注意Swift的写法,1_000.0等同于1000.0 var m: Double { return self } //self指自己的值 var cm: Double { return self / 100.0 } var mm: Double { return self / 1_000.0 } var ft: Double { return self / 3.28084 }}let oneInch = 25.4.mm //调用Double的mm属性,25.4是Double类型,.mm表示取当前值的属性mmprint("One inch is \(oneInch) meters")// 输出 "One inch is 0.0254 meters"let threeFeet = 3.ftprint("Three feet is \(threeFeet) meters")// 输出 "Three feet is 0.914399970739201 meters"
let aMarathon = 42.km + 195.m //42.km得到Double类型的42000.0, 195.m得到Double类型的195.0print("A marathon is \(aMarathon) meters long") //aMarathon是Double类型,所以带小数点// 输出 "A marathon is 42195.0 meters long"
构造函数:跟定义结构体的构造函数很像
Extension支持新定义构造函数, 而且该函数可以调用原有的构造函数并实现需要自定义的逻辑。
struct Size { var width = 0.0, height = 0.0}struct Point { var x = 0.0, y = 0.0}struct Rect { var origin = Point() var size = Size()}
extension Rect { init(center: Point, size: Size) { let originX = center.x - (size.width / 2) let originY = center.y - (size.height / 2) self.init(origin: Point(x: originX, y: originY), size: size) //调用原有的构造函数 }}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))// centerRect's origin is (2.5, 2.5) and its size is (3.0, 3.0)注意:Rect后面的第一个参数是center,所以它执行的扩展。
方法:跟定义类成员函数很像
extension Int { func repetitions(task: () -> Void) { //参数task的数据类型是个无参数无返回值的函数 for _ in 0..<self { //表示遍历从0到当前值, 即[0,self) task() } }}
var tepInt = 3tepInt.repetitions(task: {print("hello")}) //作用同下面语句tepInt.repetitions { print("hello")}
修改属性: Swift的内部函数默认不能修改成员属性, 除非在声明函数前添加mutating关键字。 扩展要修改成员变量时,也要添加mutating关键字。
extension Int { mutating func square() { self = self * self //square函数的功能就是平方值 }}var someInt = 3someInt.square()// someInt 等于 9
下标: 跟函数类型, 区别是在调用时使用方括号。
extension Int { subscript(digitIndex: Int) -> Int { var decimalBase = 1 for _ in 0..<digitIndex { decimalBase *= 10 } return (self / decimalBase) % 10 }}
746381295[0]
// 得到 5
嵌套数据类型: 在现有类型里添加内部结构体、类或者枚举。
extension Int { enum Kind { case negative, zero, positive } var kind: Kind { switch self { case 0: return .zero case let x where x > 0: return .positive default: return .negative } }}
关于Extension记住以下几点:
1、 支持2种扩展语法, 一种是对一个现有数据类型、一种是对若干个接口类型扩展;
2、扩展支持添加构造函数、属性、方法,以及调用原有的方法和属性;
3、扩展支持定义嵌套数据类型;
0 0
- Swift3.0学习笔记-Extensions
- Swift3.0学习笔记-Extensions
- Swift3.0学习笔记-Functions
- Swift3.0学习笔记-Closures
- Swift3.0学习笔记-Initialization
- Swift3.0学习笔记-DeInitialization
- Swift3.0学习笔记-Protocols
- Swift3.0学习笔记-Generics
- Swift3.0 URLSession学习笔记
- Swift3.0 URLSession学习笔记
- App Extensions学习笔记
- App Extensions学习笔记
- Swift3.0学习笔记(一)
- Swift3.0学习笔记----遍历字符串
- Swift3.0学习笔记-String and Characters
- Swift3.0学习笔记-Collection Types
- Swift3.0学习笔记-Control Flow
- Swift3.0学习笔记-Error Handling
- maven 依赖冲突
- WEB前端 | JS基础——(12)正则表达式
- map,hash_map, unordered_map
- Java中如何根据图片文件创建Image对象,且将Image对象保存为文件形式
- Java基础(十一)——集合框架各实现类特点
- Swift3.0学习笔记-Extensions
- 反射
- linux下查看硬件资源的几个常用命令
- chapter7-数据规整化:清理、转换、合并、重塑
- homerHEVC代码阅读(42)——码率控制
- Java基础(十二)——IO流
- 勾股定理一日一证连载171
- TODO:从数据库中随机抽取一条记录
- Java--基础(七)多态