扩展

342
  1. 扩展基础
    1. swift的扩展使用关键字extension
    2. swift的扩展相当于OC的分类,即只能新增方法不能新增存储属性。
extension Double {
    var km: Double {
        return self * 1000
    }
    
    var cm: Double {
        return self / 100.0
    }
    
    var mm: Double {
        return self / 1000.0
    }
}

var a: Double = 1000
print(a.cm)
  1. 构造器的扩展
    1. 枚举类型和结构体类型只可以有指定构造器没有便利构造器。而类可以有指定构造器和遍历构造器。
    2. 类既可以有构造器也可以有遍历构造器。
    3. 扩展只可以为枚举类型和结构体类型扩展指定构造器,不能扩展遍历构造器。
    4. 扩展只能给类扩展遍历构造器,不能扩展指定构造器。
//只能给类扩展遍历构造器
class Test {
    var name: String = ""
    init(name: String) {
        self.name = name
    }
}

extension Test {
  convenience init(nameStr: String) {
    self.init(name: nameStr)
       self.name = nameStr
    }
}

//只能给结构体,枚举扩展指定构造器
struct TestStruct {
    var name: String
    init(name: String) {
        self.name = name
    }
}

extension TestStruct {
    init(nameStr: String) {
        self.init(name: nameStr)
        self.name = nameStr + "test"
    }
}

enum TestEnum {
    case one, two ,three
}

extension TestEnum {
    init(type: String) {
        switch type {
        case "one":
            self = .one
        case "two":
            self = .two
        case "three":
            self = .three
        default:
            self = .one
        }
    }
}

var a = TestEnum(type: "one")
  1. 扩展方法
    1. 可以给结构体,类扩展实例方法,类方法。
    2. 可以给结构体,枚举类型扩展可变实例方法。
extension Int {
    //1. 扩展实例方法
   func repeatClosure(closure: () -> Void){
        for _ in 0..<self{
            closure()
        }
    }
    
    //2. 扩展可变实例方法 (结构体或者枚举类型用)
    mutating func square(){
        self = self * self
    }
    
    //3. 扩展类方法
    static func sum(_ one: Int, _ two: Int) -> Int{
        return one + two
    }
}

3.repeatClosure {
    print("Hello World!")
}

var a = 3
a.square()
print(a)

print(Int.sum(3,5))
  1. 扩展下标
extension Int {
    subscript(num: Int) -> Int {
        var numShi = 1
        for _ in 0..<num{
            numShi *= 10
        }
        
       return (self/numShi) % 10
    }
}

var a = 123456789
print(a[0])
print(a[2])
  1. 扩展嵌套类型
extension Int {
    enum Kind: String {
        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 check(numbers: [Int]) {
    for item in numbers {
        switch item.kind {
        case .negative:
            print("-", terminator: " ")
        case .zero:
            print("0", terminator: " ")
        case .positive:
            print("+", terminator: " ")
        }
    }
}

check(numbers: [3, 19, -27, 0, -6, 0, 7])
  1. 总结
    1. 枚举类型的扩展
      1. 可以给枚举类型扩展实例方法,类方法,实例可变方法。
      2. 可以扩展指定构造器。
      3. 可以扩展下标
      4. 可以扩展嵌套类型
    2. 结构体的扩展
      1. 可以扩展计算属性
      2. 可以扩展实例方法,类型方法,实例可变方法。
      3. 可以扩展指定构造器。
      4. 可以扩展下标。
      5. 可以扩展嵌套类型。
    3. 类的扩展
      1. 可以扩展计算属性。
      2. 可以扩展实例方法,类型方法。
      3. 可以扩展便利构造器。
      4. 可以扩展下标
      5. 可以扩展嵌套类型