美文网首页Swift
iOS Swift命名空间

iOS Swift命名空间

作者: iOneWay | 来源:发表于2019-05-21 01:45 被阅读22次

Swift的命名空间是以模块来划分的,一个模块表示一个命名空间,我们进行APP开发是,默认添加到主target的内容是同处于同一个命名空间的。如果用Cocoapod的方式导入的第三方库,是以一个单独的target存在,不会存在命名冲突。如果是以源码的方式导入工程中,很有可能发生命名冲突。所以,为了安全起见,第三方库都会使用命名空间这种方式来防止冲突。在Objective-C上没有命名空间,一般是使用方法名前面加前缀的方式避免冲突。

以下是图片加载库Kingfisher的命名空间实现方式

public struct KingfisherWrapper<Base> {
    public let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}

/// Represents an object type that is compatible with Kingfisher. You can use `kf` property to get a
/// value in the namespace of Kingfisher.
public protocol KingfisherCompatible: AnyObject { }

/// Represents a value type that is compatible with Kingfisher. You can use `kf` property to get a
/// value in the namespace of Kingfisher.
public protocol KingfisherCompatibleValue {}

extension KingfisherCompatible {
    /// Gets a namespace holder for Kingfisher compatible types.
    public var kf: KingfisherWrapper<Self> {
        get { return KingfisherWrapper(self) }
        set { }
    }
}

extension KingfisherCompatibleValue {
    /// Gets a namespace holder for Kingfisher compatible types.
    public var kf: KingfisherWrapper<Self> {
        get { return KingfisherWrapper(self) }
        set { }
    }
}

extension UIImage: KingfisherCompatible { }
extension UIImageView: KingfisherCompatible { }
extension UIButton: KingfisherCompatible { }

上段代码已经定义了命名空间:“kf”
以下是kf命名空间内添加方法,并使用

extension KingfisherWrapper where Base: Image {
//为UIIMage动态添加animatedImageData属性
    private(set) var animatedImageData: Data? {
        get { return getAssociatedObject(base, &animatedImageDataKey) }
        set { setRetainedAssociatedObject(base, &animatedImageDataKey, newValue) }
    }

      //为UIIMage动态添加scale计算属性
    var scale: CGFloat {
        return 1.0
    }

//使用:
let img = UIImage()
let scale = img.kf.scale //获取kf命名空间下的scale属性

在学习swift中发现,Data类型在swift中也是值类型
swift中值类型除了数值类型外,Array, Dictionary, String , Data, Struct, Enum 均为值类型
Mark:之后有时间做详细解释

相关文章

  • iOS Swift命名空间

    Swift的命名空间是以模块来划分的,一个模块表示一个命名空间,我们进行APP开发是,默认添加到主target的内...

  • Swift中String转Class类名

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

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

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

  • iOS开发之swift命名空间

    导语 命名空间(namespace)想必对于有开发经验的同学来说不会陌生,swift里面引入了这一语言特性,这篇文...

  • Swift命名空间

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

  • Swift - 命名空间

  • Swift 命名空间

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

  • swift命名空间

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

  • Swift添加命名前缀

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

  • Swift 动态获取命名空间

    在swift中有时候需要动态获取命名空间,通过命名空间创建类 这里是通过命名空间创建一个视图控制器的代码

网友评论

    本文标题:iOS Swift命名空间

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