Swift 定义命名空间

使用过第三方 KingFisher的小伙伴, 肯定使用过 ImageView.kf 吧,这个是怎么实现的呢? 为啥要这么做呢?

虽然 Swift 不像OC那样, 只有一个命名空间, Swift 一个 module 就代表一个命名空间。

既然是引入的第三方库, 本来就是一个module, 其实不需要添加 kf 这样的关键字, 也不会和项目中的类或者方法名等造成命名冲突, 但是为了使用上引起不必要的理解冲突, 我们定义这样的命名空间, 使得代码的可读性增强。

定义命名空间, 需要做的有以下操作

  • 定义一个泛型类
public struct YongHandel {
    public var base: Base

    public init(_ base: Base) {
        self.base = base
    }
}

其中 YongHandel 可以指定为 module 的名称, 还有一个存储属性, 一个初始化方法;

  • 定义一个 泛型协议
public protocol YongHandelCompatible {
    associatedtype CompatibleType
    
    static var yh: CompatibleType.Type { get }
    var yh: CompatibleType { get }
}

其中 定义关联类型 CompatibleType, 一个只读类计算属性 yh, 一个只读的实例计算属性 yh;

  • 定义协议的默认扩展属性
extension YongHandelCompatible {
    public static var yh: YongHandel.Type {
        return YongHandel.self
    }
    
    public var yh: YongHandel {
        return YongHandel(self)
    }
}

其中类计算属性, 返回类本身, 实例计算属性, 返回类的实例;

至此我们的命名空间定义完成

如何去使用呢?

  • 给 UIcolor 添加命名空间

定义:

extension UIColor: YongHandelCompatible { }

extension YongHandel where Base == UIColor {
    
    public static var themeColor: UIColor {
        return UIColor.red
    }
    
    public var backColor: UIColor {
        return UIColor.purple
    }
}

使用:

view.backgroundColor = UIColor.yh.themeColor
  • 给 String 添加命名空间
extension String: YongHandelCompatible { }

extension YongHandel where Base == String {
    
    public static var toolTip: String {
        return "hello world"
    }
    
    public var message: String {
        return "真好用"
    }
}

使用

let str = String.yh.toolTip

参考 KingFisher

你可能感兴趣的:(Swift 定义命名空间)