My Octopress Blog

A blogging framework for hackers.

Swift Extension

extensions可以给已有的type增加功能,而且不必访问源代码(retroactive modeling)

extensions可以

  • 增加computed propertycomputed static property
  • 定义instance methodstype methods
  • 提供新的initializers
  • 定义subscripts
  • 定义和使用新的nested types
  • 为一个type实现一个protocol

extension不可以

  • extension可以增加新的funtionality,但是不能覆盖以有的functionality
  • extension不能增加stored properties,或者给存在的property增加property observers
  • extension不能增加新的designated initializer

Extension 语法

extension SomeType {
    ...
}

extiosion SomeType: Someprotocol, AnotherProtocol {
    ...
}

一个有趣的例子

extension Double {
    var km: Double { return self * 1000.0 }
    var m: Double { return self }
}

let aMarathon = 42.m + 195.m
println("A marathon is \(aMarathon) masters long")

Initializers

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

Methods

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

3.repetitions{ println("hello") }

Mutating Instance Methods

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

var someInt = 3.square()

Subscripts

extension Int {
    subscript(var digitIndex: Int) -> Int{
        var decimalBase = 1
        while digitIndex > 0 {
            decimalBase *= 10
            --digitIndex
        }

        return (self / decimalBase) % 10
    }
}

74631295[1] //return 9

Nested Tyeps

extension Int {
    enum Kind {
        case Negative, Zero, Positive
    }

    var kind: Kind {
        switch self {
        case 0: retrun .Zero
        case let x where x > 0: return .Positive
        default: return .Negative
        }
    }
}