简介:
这里要说的命名空间不是基于module的命空间,关于module的命名空间,详情可点这里。在OC中为了做区分,通常我们会在创建类的时候以大写字母作为前缀(AF,SD等),而在Swift中目前较流行的做法是基于扩展(extension),协议(protocol)还有泛型(generic)实现的,常见如RXSwift的.rx,Kingfisher的.kf。
实现:
public final class ZY<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
public protocol ZYCompatible {
associatedtype CompatibleType
var zy: CompatibleType { get }
}
public extension ZYCompatible {
public var zy: ZY<Self> {
get { return ZY(self) }
}
}
我们首先定义了一个不能被继承的类ZY,该类有一个Base 类型的属性,而后定义了一个ZYCompatible协议,该协议有一个只读的计算型属性zy,这里用到了协议的关联类型,最后我们将两者结合起来,在对协议的拓展中我们默认实现了zy这个计算属性的get方式,并且将其类型指定为遵守了该协议的泛型。
示例:
extension NotificationCenter: ZYCompatible{}
extension ZY where Base: NotificationCenter {
func post(name aName: NSNotification.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable : Any]? = nil)
}
NotificationCenter.default.zy.post(name: NSNotification.Name("userLogin"), object: nil)
NotificationCenter.default.post(name: NSNotification.Name.UIKeyboardWillShow, object: nil)
这样我们就可以通过命名空间将系统通知和我们的业务通知区分开来。
网友评论