swift学习笔记之-扩展(Extensions)

//扩展(Extensions)

 

import UIKit

 

/*扩展(Extensions):扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )

 

Swift 中的扩展可以:扩展可以为一个类型添加新的功能,但是不能重写已有的功能

    1.添加计算型属性和计算型类型属性,扩展可以添加新的计算型属性,但是不可以添加存储型属性,也不可以为已有属性添加属性观察器

    2.定义实例方法和类型方法

    3.提供新的构造器:

        1.扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。

        2.如果你使用扩展为一个值类型添加构造器,且该值类型的原始实现中未定义任何定制的构造器时,你可以在扩展中的构造器里调用逐一成员构造器。如果该值类型为所有存储型属性提供了默认值,你还可以在扩展中的构造器里调用默认构造器。

    4.扩展可以为已有类型添加新下标

    5.定义和使用新的嵌套类型

    6.使一个已有类型符合某个协议

在 Swift 中,你甚至可以对协议进行扩展,提供协议要求的实现,或者添加额外的功能,从而可以让符合协议的类型拥有这些功能

 

扩展语法(Extension Syntax):可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议

extension SomeType: SomeProtocol, AnotherProctocol { // 为 SomeType 添加的新功能写到这里 }

 

如果你通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的

 

 

 

 

 

 

*/

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

print("One inch is \(oneInch) meters")

// 打印 “One inch is 0.0254 meters”

let threeFeet = 3.ft

print("Three feet is \(threeFeet) meters")

// 打印 “Three feet is 0.914399970739201 meters”

let aMarathon = 42.km + 195.m

print("A marathon is \(aMarathon) meters long")

// 打印 “A marathon is 42195.0 meters long”

//==============================

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()

}

//因为结构体 Rect 未提供定制的构造器,因此它会获得一个逐一成员构造器。又因为它为所有存储型属性提供了默认值,它又会获得一个默认构造器

let defaultRect = Rect()

let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),

    size: Size(width: 5.0, height: 5.0))

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 的原点是 (2.5, 2.5),大小是 (3.0, 3.0)

//================================

extension Int {

    func repetitions(task: () -> Void) {

        for _ in 0..<self {

            task()

        }

    }

}

3.repetitions({

    print("Hello!")

})

// Hello!

// Hello!

// Hello!

//通过扩展添加的实例方法也可以修改该实例本身。结构体和枚举类型中修改 self 或其属性的方法必须将该实例方法标注为 mutating,正如来自原始实现的可变方法一样

extension Int {

    mutating func square() {

        self = self * self

    }

}

var someInt = 3

someInt.square()

print(someInt)

// someInt 的值现在是 9

//===================================

extension Int {

    subscript(var digitIndex: Int) -> Int {

        var decimalBase = 1

        while digitIndex > 0 {

            decimalBase *= 10

            --digitIndex

        }

        return (self / decimalBase) % 10

    }

}

746381295[0]

// 返回 5

746381295[1]

// 返回 9

746381295[2]

// 返回 2

746381295[8]

// 返回 7

746381295[9]

// 返回 0,即等同于:

0746381295[9]

//===============================

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

        }

    }

}

func printIntegerKinds(numbers: [Int]) {

    for number in numbers {

        switch number.kind {

        case .Negative:

            print("- ", terminator: "")

        case .Zero:

            print("0 ", terminator: "")

        case .Positive:

            print("+ ", terminator: "")

        }

    }

    print("")

}

printIntegerKinds([3, 19, -27, 0, -6, 0, 7])

// 打印 “+ + - 0 - 0 +”

posted on 2016-07-25 22:46  SuriFuture  阅读(675)  评论(0编辑  收藏  举报

导航