zoukankan      html  css  js  c++  java
  • Swift扩展

    Swift中的「扩展」(extensions)和OC中的categories类似,只是Swift中的「扩展」没有名字。Swift中的「扩展」可以向一个已有的类/结构体/枚举类型添加新功能,这包括在没有权限获取源代码的情况下扩展类型的能力(即逆向建模)。Swift中的「扩展」可以:

    • 添加计算型实例属性和计算型类型属性;
    • 定义实例方法和类型方法;
    • 提供新的构造器;
    • 定义下标(subscripts);
    • 定义和使用嵌套类型;
    • 使已有类型遵守某个协议;

    值得一提的是,和OC中的categories一样,Swift中的extensions不可以添加存储型属性;它可以为已有类型添加方法/计算型属性/下标/构造器,但是不能override已有的方法/计算型属性/下标/构造器;

    Extensions语法

    使用关键字extension声明一个扩展,如下:

    extension SomeType {
        // new functionality to add to SomeType goes here
    }

    一个extension可以扩展一个已有类型,使其能够适配一个或多个协议。此时,接口的名字应该完全按照类或结构体的名字的方式进行书写:

    extension SomeType: SomeProtocol, AnotherProtocol {
        // implementation of protocol requirements goes here
    }

    扩展计算型属性

    extension可以向已有类型添加「计算型实例属性」和「计算型类型属性」。下面的例子向Swift的内置Double类型添加5个计算型实例属性,从而提供与距离单位协作的基本支持,如下:

    extension Double {
        var km: Double { return self * 1_000.0 }
        var m: Double { return 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
    println("One inch is (oneInch) meters")
    // prints "One inch is 0.0254 meters"
    let threeFeet = 3.ft
    println("Three feet is (threeFeet) meters")
    // prints "Three feet is 0.914399970739201 meters"

    P.S:25.4.mm有种现实物理应用的感觉,屌爆了!

    注意:extension可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(即didSet和willSet代码块)。

    扩展构造器

    extension可以向已有类型添加新的构造器。这可以让你扩展其他类型,将你自己的定制类型作为构造器参数,或者提供该类型的额外初始化选项(而这些额外处理在原始实现中并没有被包含)。

    值得一提的是,如果你使用扩展提供了一个新的构造器,你依旧有责任保证构造过程能够让所有实例完全初始化。

    扩展方法

    extension可以向已有类型添加新的实例方法类型方法。下面的例子向Int类型添加一个名为repetitions的新实例方法:

    extension Int {
        func repetitions(task: () -> ()) {
            for _ in 0..<self {
                task()
            }
        }
    }

    定义该扩展之后,你就可以对任意整数调用repetitions方法,实现的功能则是多次执行某任
    务:

    3.repetitions({
        println("Hello!")
    })
    // Hello!
    // Hello!
    // Hello!

    可以使用trailing闭包使调用更加简洁:

    3.repetitions {
        println("Goodbye!")
    }
    // Goodbye!
    // Goodbye!
    // Goodbye!

    上述针对Int的扩展方法属于immutable方法,其实也可以扩展mutable方法,在定义式中加上一个mutating关键字修饰即可。

    扩展下标

    extension可以向一个已有类型添加新下标。下面栗子向Swift内置类型Int添加了一个整型下标。该下标[n]返回十进制数字从右向左数的第n个数字:

    123456789[0]返回9
    123456789[1]返回8
    代码实现如下:
    extension Int {
        subscript(var digitIndex: Int) -> Int {
            var decimalBase = 1
            while digitIndex > 0 {
                decimalBase *= 10
                --digitIndex
            }
            return self / decimalBase % 10
        }
    }
    746381295[0]
    // returns 5
    746381295[1]
    // returns 9
    746381295[2]
    // returns 2
    746381295[8]
    // returns 7
  • 相关阅读:
    python遍历字典元素
    Asp.net网站优化【转】
    三、HTTP协议
    二、 OSI模型的实现TCP 、IP
    一、OSI模型
    JVM原理:4 运行期优化
    JS:jquery插件表格单元格合并.
    28-语言入门-28-1的个数
    27-语言入门-27-成绩转换
    26-语言入门-26-兄弟郊游问题
  • 原文地址:https://www.cnblogs.com/FightingLuoYin/p/4608180.html
Copyright © 2011-2022 走看看