Swift|Swift 定义命名空间
使用过第三方 KingFisher的小伙伴, 肯定使用过 ImageView.kf 吧,这个是怎么实现的呢? 为啥要这么做呢?虽然 Swift 不像OC那样, 只有一个命名空间, Swift 一个 module 就代表一个命名空间。
既然是引入的第三方库, 本来就是一个module, 其实不需要添加 kf 这样的关键字, 也不会和项目中的类或者方法名等造成命名冲突, 但是为了使用上引起不必要的理解冲突, 我们定义这样的命名空间, 使得代码的可读性增强。
定义命名空间, 需要做的有以下操作
- 定义一个泛型类
public struct YongHandel {
public var base: Basepublic init(_ base: Base) {
self.base = base
}
}
其中 YongHandel 可以指定为 module 的名称, 还有一个存储属性, 一个初始化方法;
- 定义一个 泛型协议
public protocol YongHandelCompatible {
associatedtype CompatibleTypestatic 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
【Swift|Swift 定义命名空间】参考 KingFisher
推荐阅读
- JS中的各种宽高度定义及其应用
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 列出所有自定义的function和view
- Swift中willSet和didSet的简述
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- iOS-Swift-map|iOS-Swift-map filter reduce、函数式编程
- 运营是什么()