21.扩展

2021-07-23  本文已影响0人  LucXion

扩展可以给类、结构体、枚举增加新功能,并且不需要访问该类型的源码(逆向建模)。和OC中的分类不同,Swift中的扩展是没有名字的。

  1. 扩展可以添加新的计算属性,但是它们不能添加存储属性,或向现有的属性添加属性观察者。

    // 扩展
    extension Double {
        var km : Double {self * 1000.0} // 定义      实例 计算属性
    //    var cm : Double = 0 //           不可以定义 实例 存储属性
    
        static var cm:Double {1.0} //      定义      类  计算属性
        static var className = "Double" // 定义      类  存储属性
      // 不能使用 class,class代表可以被重写
    }
    var wayLong = 2.2.km
    print("wayLong = \(wayLong)米")
    print(Double.className)
    
  2. 扩展构造器

    struct Point {
        var x : Double = 0
        var y : Double = 0
    }
    struct Size {
        var width : Double = 0
        var height: Double = 0
    }
    struct Rect {
        var point :Point
        var size : Size
    }
    extension Rect {
        init(center:Point,size:Size) {
    //        print(self.point) // 值类型扩展构造器,在调用构造器之前不能调用 self
            self.init(point: Point.init(x: center.x - size.width / 2, y: center.y - size.height / 2), size: size)//值类型已经为所有存储属性提供默认值,且没有定义任何自定义构造器,那么你可以在该值类型扩展的构造器中使用默认构造器和成员构造器
            print(self.point)
        }
    }
    class Person {
        var name:String
        init(name:String) {
            self.name = name
        }
    }
    extension Person {
        convenience init(someelse:String) { // 引用类型,只能在扩展中扩展便利构造器
            self.init(name: someelse)
        }
    }
    
  3. 扩展类方法和实例方法、可变实例方法

    extension Int {
        static func doSome() {
            print("do-some")
        }
        func repeatTime(block:()->Void) {
            for _ in 0..<self {
                block()
            }
        }
        mutating func square() {
                self = self * self
            }
    }
    Int.doSome()
    3.repeatTime {
        print("哒哒哒")
    }
    var a = 3
    a.square()
    print(a)
    
  4. 给现有类型添加下标

  5. 添加类型嵌套

上一篇下一篇

猜你喜欢

热点阅读