美文网首页
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