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    }}

  1. 746381295[0]
  2. // 得到 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
原创粉丝点击