Swift3命名空间的实现
最近在看一些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方法)。
整个过程比较绕,主要还是通过协议来划分命名空间,只有遵循协议的类才拥有该命名空间,这可能需要进一步理解。
作者:星___尘
链接:https://www.jianshu.com/p/7808aacc0e42
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Swift3命名空间的实现的更多相关文章
- Swift3.0 功能一(持续更新)
修改项目名称两种方式 1.Bundle name 2.Bundle display name try 三种处理异常的方式 // 在swift中提供三种处理异常的方式 // 方式一:try方式 程序员手 ...
- 【.net 深呼吸】细说CodeDom(3):命名空间
在上一篇文章中,老周介绍了表达式和语句,尽管老周没有把所有的内容都讲一遍,但相信大伙至少已经掌握基本用法.在本文中,咱们继续探讨 CodeDom 方面的奥秘,这一次咱们聊聊命名空间. 在开始之前,老周 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- C++中的命名空间
一,命名空间(namespace)的基本概念以及由来 1.什么是标识符: 在C++中,标识符可以是基本的变量,类,对象,结构体,函数,枚举,宏等. 2.什么是命名空间: 所谓的命名空间是指标识符的可见 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- Swift3中函数的使用
前言:前不久,Swift语言也更新到了3.0版本,对编程有一定基础的朋友一定不会对函数这个概念陌生.而Swift语言中的函数也是大同小异的,今天就跟着小编来学习一下Swift3中函数的不一样的用法. ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...
- .Net 序列化(去除默认命名空间,添加编码)
1.序列化注意事项 (1).Net 序列化是基于对象的.所以只有实例字段呗序列化.静态字段不在序列化之中. (2)枚举永远是可序列化的. 2.XML序列化时去除默认命名空间xmlns:xsd和xmln ...
随机推荐
- (17)会话之Cookie的使用详解
Cooke技术 1,特点 Cookie技术:会话数据保存在浏览器客户端. 2,Cookie技术核心 Cookie类:用于存储会话数据 1)构造Cookie对象 Cookie(java.lang.St ...
- Object Query Language (OQL) query 基本使用
OQL是对java堆内存进行查询分析 使用方法: 1.查看java线程id jps -lvm 上图红框中的为pid: 2.运行命令-导出堆内存信息-会生成一份文件在你本地 jmap -dump:liv ...
- ARM WFI和WFE指令【转】
本文转载至:http://www.wowotech.net/armv8a_arch/wfe_wfi.html 1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究 ...
- python利用决策树进行特征选择
python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...
- BZOJ_2118_墨墨的等式_最短路
BZOJ_2118_墨墨的等式_最短路 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及 ...
- asp.net MVC Model 类的主键 int类型、string类型、GUID类型。
在使用asp.net mvc进行定义 模型类的时候,一般情况下,我们都会定义一个属性为 int iD{get;set;} 或为int ClassNameID {get;set;},在这种情况下 1.I ...
- java笔记之IO2写操作
IO流的分类 流向: 输入流 读出数据 输出流 写出数据 数据类型 字节流 字节输入流 读取数据 inputstream 字节输出流 写出数据 outputstream 字符流 字符输入流 读取数据 ...
- ASP.NET验证控件CustomValidator客户端验证DropDownList、TextBox
<asp:DropDownList ID="ddlTown" runat="server"> <asp:ListItem Value=&quo ...
- Swift4 扩张(Extenstion), 集合(Set)
创建: 2018/03/09 完成: 2018/03/10 更新: 2018/04/19 修改小标题 [扩张的定义与使用协议] -> [通过扩张来采用协议] 更新: 2018/09/18 标题 ...
- bzoj 1625: [Usaco2007 Dec]宝石手镯【背包】
裸的01背包 #include<iostream> #include<cstdio> using namespace std; int c,n,w,v,f[20001]; in ...