美文网首页
Extensions

Extensions

作者: 夜雨聲煩_ | 来源:发表于2017-12-29 00:25 被阅读0次
    • swift中扩展适用于类、结构体、枚举和协议
    • swift中的extension类似于Oc中的categories,不同之处在于extension没有名字
    • swift中的extension可以
      1.增加计算实例属性和计算类型属性
      2.定义实例方法和类型方法
      3.提供新的构造器
      4.定义附属脚本语句
      5.定义和使用新的内嵌类型
      6.使现有的类型遵循协议
    • extension可以实现和拓展协议,使遵循该协议的类实现更多功能
    • extension可以使一个类型新增功能,但是不能使其重载现有的
    • 使用extension关键字定义扩展
      extension SomeType {
        //new functionality to add to Sometype goes here
      }
      
    • 使用extension关键字加协议名实现协议扩展和实现
      extension SomeType: SomeProtocol, AnotherProtocol {
        //inplementation of protocol requirement goes here
      }
      
    • 在原类基础上扩展的新方法,可以应用于所有的原类实例中,即使实例创建于扩展声明前
    • extension扩展计算属性
      //Computed Properties
      extension Double {
        var Km: Double { return self * 1_000 }
        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")
      let threeFeet = 3.ft
      print("Three feet is \(threeFeet) meters")
      
    • extension可以添加计算属性,但是不能添加存储属性或给现有的属性添加观察者
    • extension可以添加便利构造器(不用convenience关键字),但是不能添加指定构造器和析构器
      //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()
      }
      
      let defaultRect = Rect()
      let memberwiseRect = Rect.init(origin: Point.init(x: 2.0, y: 2.0), size:   Size.init(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.init(x: originX, y: originY), size: size)
        }
      }
      
      let centerRect = Rect.init(center: Point.init(x: 4.0, y: 4.0), size:         Size.init(width: 3.0, height: 3.0))
      
    • extention添加方法
      //Methods
      extension Int {
        func repetitions(task: () -> Void) {
            for _ in 0..<self {
                task()
            }
        }
      }
      3.repetitions {
        print("Hello")
      }
      
      无参数无返回值的闭包作为方法参数,直接在方法大括号内加入实现
    • extension中使用mutating关键字来改变自身
      //Mutating Instance Methods
      extension Int {
        mutating func square {
            self = self * self
        }
      }
      var someInt = 3
      someInt.square()
      
    • extension附属脚本
      extension Int {
        subscript(digitIndex: Int) -> Int {
            var decimalBase = 1
            for _ in 0..<digitIndex{
                decimalBase *= 10
            }
            return (self / decimalBase) % 10
        }
      }
      
      print("\(12345678[0])")
      print("\(12345678[3])")
      
    • extension内嵌类型
      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])
      

    相关文章

      网友评论

          本文标题:Extensions

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