美文网首页
Swift 定义命名空间

Swift 定义命名空间

作者: foolish_hungry | 来源:发表于2019-02-02 16:37 被阅读0次

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

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

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

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

  • 定义一个泛型类
public struct YongHandel<Base> {
    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<Self>.Type {
        return YongHandel.self
    }
    
    public var yh: YongHandel<Self> {
        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 定义命名空间

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

  • Swift中String转Class类名

    String->Class Swift中引入了命名空间的概念,转Class需要拼接命名空间 注意Swift中引入了...

  • Swift学习之通过字符串创建对象

    一、swift的空间命名机制在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名...

  • NDK开发:C++基础

    一、命名空间 standard:标准命名空间 命名空间类似于java中的包。 自定义命名空间 使用命名空间 ::为...

  • Swift命名空间

    之前在使用RxSwfit的时候对.rx这个东西的一直有些疑问,不清楚实现原理,趁着现在有些空余时间,打算深入研究下...

  • Swift - 命名空间

  • Swift 命名空间

    Swift中新增了命名空间的概念作业:避免重复不同的项目命名空间是不一样的,默认情况下命名空间的名称就是当前项目的...

  • swift命名空间

    [TOC] 在OC中并没有命名空间,所以通过cocoapod或者静态库已经自己编写的代码,都会被编译到同一个域和二...

  • C++入门05 --命名空间,继承,访问权限,初始化列表

    命名空间 命名空间主要是用来解决命名冲突的; namespace xxxx { }:命名空间的定义; 利用::域运...

  • Swift添加命名前缀

    Swift命名前缀 Swift的命名空间是基于模块(module),每一个module代表了一个Swift中的一个...

网友评论

      本文标题:Swift 定义命名空间

      本文链接:https://www.haomeiwen.com/subject/uaissqtx.html