什么是Swift的扩展?

扩展就是向一个已有的类、结构体或枚举类型添加新功能。
扩展可以对一个类型添加新的功能,但是不能重写已有的功能。

所以这也是一个java 没有的特性,但是同时又跟java的extend关键字(继承)很像

swift的扩展能干什么?
添加计算型属性和计算型静态属性
定义实例方法和类型方法
提供新的构造器
定义下标
定义和使用新的嵌套类型
使一个已有类型符合某个协议

声明:
使用关键字extension:

extension SomeType {
    // 加到SomeType的新功能写到这里
}
//或者
extension SomeType: SomeProtocol, AnotherProctocol { //一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议,语法格式如下:
    // 协议实现写到这里
}

下面看一下应用于各个方面

//下面的例子向 Int 类型添加了 5 个计算型实例属性并扩展其功能: 所以这就是拓展了Int类
extension Int {
   var add: Int {return self + 100 }
   var sub: Int { return self - 10 }
   var mul: Int { return self * 10 }
   var div: Int { return self / 5 }
}
let addition = 3.add
print("加法运算后的值:\(addition)")
    
let subtraction = 120.sub
print("减法运算后的值:\(subtraction)")

扩展可以向已有类型添加新的构造器。
这可以让你扩展其它类型,将你自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。
扩展可以向类中添加新的便利构造器 init(),但是它们不能向类中添加新的指定构造器或析构函数 deinit() 。

struct sum {
    var num1 = 100, num2 = 200
}

struct diff {
    var no1 = 200, no2 = 100
}

struct mult {
    var a = sum()
    var b = diff()
}


extension mult {
    init(x: sum, y: diff) {
        _ = x.num1 + x.num2
        _ = y.no1 + y.no2
    }
}


let a = sum(num1: 100, num2: 200)
let b = diff(no1: 200, no2: 100)

let getMult = mult(x: a, y: b)
print("getMult sum\(getMult.a.num1, getMult.a.num2)")
print("getMult diff\(getMult.b.no1, getMult.b.no2)")

同样
扩展可以向已有类型添加新的实例方法和类型方法。
下面的例子向Int类型添加一个名为 topics 的新实例方法:所谓实例方法 就是方法

extension Int {
   func topics(summation: () -> ()) {
      for _ in 0..<self {
         summation() 
      }
   }
}  

4.topics({
   print("扩展模块内") //把这句话重复四遍
})    

同样也可以扩展出来新的下标机制。

extension Int {
   subscript(var multtable: Int) -> Int {
      var no1 = 1
      while multtable > 0 {
         no1 *= 10
         --multtable
      }
      return (self / no1) % 10
   }
}
    
print(12[0])
print(7869[1])
print(786543[2])
posted @ 2020-06-21 10:47  EvanMeetTheWorld  阅读(33)  评论(0)    收藏  举报