美文网首页
Swift自定义命名空间的学习

Swift自定义命名空间的学习

作者: Dreamer_做梦的人 | 来源:发表于2017-10-20 23:53 被阅读174次

最近看到一篇文章,实现swift中UIView的链式调用的简单封装。
其中谈到为了防止自己在extension中声明的方法与未来UIView中新推出的方法重名或者冲突,使用了命名空间形式扩展的实现。来达到如下的效果

let label = UILabel()
    .hand.adhere(toSuperView: view)
    .hand.layout { (make) in
        make.top.equalToSuperview().offset(80)
        make.centerX.equalToSuperview()
    }
    .hand.config(labelConfiger)

其中每次具体方法调用之前都需要调用hand就是一种命名空间形式的扩展。
然后源代码如下:

public protocol NamespaceWrappable {
    associatedtype WrapperType
    var hand: WrapperType { get }
    static var hand: WrapperType.Type { get }
}

public extension NamespaceWrappable {
    var hand: NamespaceWrapper<Self> {
        return NamespaceWrapper(value: self)
    }

 static var hand: NamespaceWrapper<Self>.Type {
        return NamespaceWrapper.self
    }
}

public struct NamespaceWrapper<T> {
    public let wrappedValue: T
    public init(value: T) {
        self.wrappedValue = value
    }
}

最后附上命名空间形式下对UIView调用方法的扩展

import UIKit
import SnapKit

extension UIView: NamespaceWrappable { }
extension NamespaceWrapper where T: UIView {
    public func adhere(toSuperView: UIView) -> T {
        toSuperView.addSubview(wrappedValue)
        return wrappedValue
    }

    @discardableResult
    public func layout(snapKitMaker: (ConstraintMaker) -> Void) -> T {
        wrappedValue.snp.makeConstraints { (make) in
            snapKitMaker(make)
        }
        return wrappedValue
    }

    @discardableResult
    public func config(_ config: (T) -> Void) -> T {
        config(wrappedValue)
        return wrappedValue
    }
}

本质上,就是把类似于adhere,layout,config这样的方法从UIView的名下挪到NamespaceWrapper下,让UIView能够获取NamespaceWrapper的实例来进行间接调用。

相关文章

  • Swift自定义命名空间的学习

    最近看到一篇文章,实现swift中UIView的链式调用的简单封装。其中谈到为了防止自己在extension中声明...

  • NDK开发:C++基础

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

  • Swift中String转Class类名

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

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

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

  • C++语言-类中各个重要函数原理

    1、命名空间 引入命名空间,我们就可以使用命名空间里的函数,以及成员 自定义命名空间 2、构造函数 1、先在头文件...

  • Swift命名空间

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

  • Swift - 命名空间

  • Swift 命名空间

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

  • swift命名空间

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

  • Swift添加命名前缀

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

网友评论

      本文标题:Swift自定义命名空间的学习

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