美文网首页
Swift中的扩展

Swift中的扩展

作者: keisme | 来源:发表于2017-09-30 15:17 被阅读4次

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

    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+"
    

    相关文章

      网友评论

          本文标题:Swift中的扩展

          本文链接:https://www.haomeiwen.com/subject/ilzgextx.html