Swift中的扩展

扩展就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。

1. 扩展语法

extension SomeType {
    // code
}

可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议:

extension SomeType: SomeProtocol, AnotherProtocol {
    // protocol code
}

2. 计算型属性

extension Double {
    var km: Double { return self * 1000 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1000.0 }
    var ft: Double { return self / 3.28084 }
}

let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// print "One inch is 0.0254 meters"

注意:
扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以为已有属性添加属性观察器。

3. 构造器

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

这个新的构造器首先根据提供的centersize的值计算一个合适的原点。然后调用该结构体的逐一成员构造器init(origin:size:),该构造器将新的原点和大小的值保存到了相应的属性中:

let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))

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

4. 方法

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

3.repetitions { 
    print("Hello")
}

// print "Hello"
// print "Hello"
// print "Hello"

4.1 可变实例方法

extension Int {
    mutating func square() {
        self = self * self
    }
}

var someInt = 3
someInt.square()
print(someInt)
// print "9"

5. 下标

extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}

print(9876543210[2])
// print "2"
print(9876543210[3])
// print "3"
print(9876543210[15])
// print "0"

6. 嵌套类型

扩展可以为已有的类、结构体和枚举添加新的嵌套类型。

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])
// print "++-0-0+"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容