Swift 增加命名空间

227 阅读1分钟

为什么有命名空间的我们仍然需要命名空间?

首先,同 module 内定义扩展同名的函数,此时会报Invalid redeclaration of 'xxfun()',而不同 module 是没有问题的。

但是我们会出现一个情况,就是不同 module 扩展了同名函数,那么我如果想使用另一个 module 定义的同名函数,这时是没有办法做到的,所以我们增加了一个 Wrapper

这里还有几个注意点:

  1. 优先使用泛型而不是 Any
  2. 扩展泛型协议,可以使用 Self 代替直接的类型

代码

struct HX<Base> {
    let base: Base
    
    init(_ base: Base) {
        self.base = base
    }
}

protocol HXCompatible {
    associatedtype HXBase
    var hx: HX<HXBase> { get set }
    static var hx: HX<HXBase>.Type { get set }
}

extension HXCompatible {
    var hx: HX<Self> {
        get {
            return HX(self)
        }
        // swiftlint:disable:next unused_setter_value
        set {
            
        }
    }
    
    static var hx: HX<Self>.Type {
        get {
            return HX<Self>.self
        }
        // swiftlint:disable:next unused_setter_value
        set {
            
        }
    }
}

extension NSObject: HXCompatible {}