Swift3命名空间的实现

作者: 星___尘 | 来源:发表于2017-05-26 00:51 被阅读387次

最近在看一些Swift开源库的时候,发现了一些优秀的开源库都使用了命名空间,例如Kingfisher这个开源库中,就针对UIImage,UIImageView,UIButton做了命名空间的扩展。通过logoImageView.kf.setImage(url) 这种方式能够很好地避免扩展的命名冲突,而且相对 logoImageView.kf_setImage(url) 这种通过前缀避免命名冲突的方式,具有更好的可读性,而且更Swifty化。

实现原理

主要通过三点来实现:

  • 泛型类
  • 泛型协议
  • 协议扩展

分析

这是演示代码:

// 定义泛型类
public final class YKKit<Base> {
    public let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}

// 定义泛型协议
public protocol YKKitCompatible {
    associatedtype CompatibleType
    var yk: CompatibleType { get }
}

// 协议的扩展 
public extension YKKitCompatible {
    public var yk: YKKit<Self>{
        get { return YKKit(self) }
    }
}

// 实现命名空间yk
extension String: YKKitCompatible {}

// String命名空间yk中的函数
extension YKKit where Base == String {
    // MARK: - Localized

    /// 国际化值
    public var localized: String {
        return NSLocalizedString(base, comment: "")
    }

}

// 使用
let string = "abcd".yk.localized

简单解析一下实现代码,主要用到了protocol和generic来实现,而且实现有点绕。

首先定义一个泛型类YKKit,使用泛型Base

然后定义支持泛型的协议YKKitCompatible,并通过协议扩展提供协议的默认实现,返回实现泛型类YKKit的对象自身。

然后对需要实现命名空间的类提供YKKitCompatible协议扩展,并实现相关命名空间的对象方法(主要是扩展新的方法,如代码中的localized方法)。

整个过程比较绕,主要还是通过协议来划分命名空间,只有遵循协议的类才拥有该命名空间,这可能需要进一步理解。

参考

Kingfisher

相关文章

  • Swift3命名空间的实现

    最近在看一些Swift开源库的时候,发现了一些优秀的开源库都使用了命名空间,例如Kingfisher这个开源库中,...

  • js常用编程模式

    1.命名空间 js中存在命名空间概念,为了减少命名冲突。但js中没有命名空间关键字。js实现思路,定义一个全局变量...

  • Nacos-2

    使用篇-续 1、不同命名空间配置可以通过导出、导入的方式实现保存、复制;2、不同命名空间配置可以通过克隆的方式实现...

  • linux内核的命名空间

    命名空间是linux内核针对实现容器虚拟化映入的一个特性。 命名空间的作用:它让我们创建的每个容器都有自己的命名空...

  • NDK开发:C++基础

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

  • Swift如何创建命名空间

    相比于OC时代的完全没有命名空间,Swift可以通过巧妙的办法,实现几乎等同于命名空间的效果。 需求 现在我们希望...

  • Nacos服务的注册与心跳

    背景 一个服务实例需要注册到多个nacos命名空间,利用nacos的命名空间实现服务的逻辑隔离。 在多租户场景下,...

  • Django2.1 URL 调度程序

    命名空间 URL命名空间和include的URLconf 可以用两种方式实现 第一种(个人推荐) 可以继续向 Dj...

  • Hbase 查询语句

    进入HBase数据库 HBase帮助命令: 命名空间 列出所有命名空间 新建命名空间 删除命名空间 该命名空间必须...

  • rapidPHP 1.1.0 - 自动加载

    什么是自动加载 采用规定的命名规则,实现new class,不存在的时候自动加载这个类 命名规则 命名空间 当前项...

网友评论

    本文标题:Swift3命名空间的实现

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