Swift使用SnapKit模仿Kingfisher第三方扩展优化

 更新时间:2022年09月14日 15:01:18   作者:剪刀石头布啊  
这篇文章主要为大家介绍了Swift SnapKit模仿Kingfisher第三方扩展优化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

我们平时用swift写第三方扩展(OC中的分类)时,可能会直接就往扩展里面写方法,简单又方便,然而当我们看一些常用你的三方(例如:Kingfisher、SnapKit)等,都会用一个简单的参数引出(例如:kfsnp),下面来探索一下怎么用的,然后在总结其优缺点

SnapKit扩展方式简要思考

SnapKit为例,使用如下,发现引入了 snp

var iv = UIImageView();
iv.snp.makeConstraints { make in
}

中间变量 snp 如下所示,ConstraintView是统一不同平台的重命名(别名)

public extension ConstraintView {
    var snp: ConstraintViewDSL {
        return ConstraintViewDSL(view: self)
    }
}

其以前版本也是直接将 left 等加上前缀 snp_,直接调用,而加入前缀我想大家一眼就看出来目的了,没错避免与其他扩展重名,现在也已经改成了引入snp的方式,来间接调用,实际逻辑都通过 snp 来调用,个人猜测也是借鉴了主流的应用来更新的,调用时,至少分类 API 整洁了

优缺点:

  • 1、引入中间变量 snp 之后,首先感觉到的就是,我们的分类在调用的时候,明显没有那么多杂乱的方法了(这种方式OC其实也可以借鉴)
  • 2、另外也可以取消了前缀,减少了代码量,并且当与其他类出现重名的时候,只需要替换 snp 的变量名字即可,不需要替换全部方法,减少了命名阻碍
  • 3、不同三方之间通过引入该参数,让我们的调用模块标识更明显,功能模块也更清晰,可维护性更强

Kingfisher扩展方式简要思考

Kingfisher为例,使用如下,发现引入了 kf

var iv = UIImageView();
iv.kf.setImage(with: URL(string: "http://www.baidu.com"))

另外其在使用过程中,通过充分利用 swift 特性,比 SnapKit 使用上更优雅高效一些

//声明一个基础协议,必须为 AnyObject 类型,可用于后续给基础类添加协议
public protocol KingfisherCompatible: AnyObject { }
//扩展实现该基础协议,以便于方便让我们的组件能够直接通过 .kf 直接调用里面的方法
//此 kf 和 snap 类似,只不过添加了一个泛型,用于不同类之间进行扩展限制
extension KingfisherCompatible {
    public var kf: KingfisherWrapper<Self> {
        get { return KingfisherWrapper(self) }
        set { }
    }
}
//通过泛型顶一个一个基础类,通过该基础类可以获取我们被扩展的组件
//且通过该基础类的泛型,可以分别给不同类型添加不同扩展方法
public struct KingfisherWrapper<Base> {
    public let base: Base
    public init(_ base: Base) {
        self.base = base
    }
}
//当遵循协议的类为 UIImage 的时候,为其扩展方法
extension KingfisherWrapper where Base: KFCrossPlatformImage {
    ...
}
//当遵循协议的类为 KFCrossPlatformImageView 的时候,为其扩展方法
extension KingfisherWrapper where Base: KFCrossPlatformImageView {
    ...
}
...
//上面仅仅是定义了一个扩展后可以使用的协议,并未应用到我们的基础组件中
//因此只需要给基础组件添加扩展,遵循我们的协议即可
extension KFCrossPlatformImageView: KingfisherCompatible { }

没见到名字的View 是为了不同平台统一名字起的别名,如下所示(打消疑虑专用)

#if os(iOS) || os(tvOS)
    public typealias ConstraintView = UIView
#else
    public typealias ConstraintView = NSView
#endif

优缺点:

  • 1、引入中间变量 kf 之后,首先感觉到的就是,我们的分类在调用的时候,明显没有那么多杂乱的方法了(这种方式OC其实也可以借鉴)
  • 2、另外也可以取消了前缀,减少了代码量,并且当与其他类出现重名的时候,只需要替换 kf 的变量名字即可,不需要替换全部方法,减少了命名阻碍
  • 3、不同三方之间通过引入该参数,让我们的调用模块标识更明显,功能模块也更清晰,可维护性更强
  • 4、引入协议和泛型,通过协议统一引入同一个中间变量,通过泛型给不同的分类扩展出不同的方法,减少无效方法和代码等,结构更清晰,某种角度上,其为进阶版的扩展方式

自行模仿尝试

public protocol MarshalTest: AnyObject {}
struct Wrapper<T>  {
    public let base: T
    init(_ base: T) {
        self.base = base
    }
}
extension MarshalTest {
    var ml: Wrapper<Self> {
        get { Wrapper(self) }
        set { }
    }
}
extension UIImageView : MarshalTest {}
extension Wrapper where T: UIImageView {
    func setImg() {
    }
}
extension Wrapper where T: UIView {
    func setBkg() {
    }
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        var iv2 = UIImageView()
        iv2.ml.setImg()  
    }
}

这就测试成功了,我们模仿时,就可以参考这个写

最后

当我们自己为默认组件扩展内容时,如果只扩展一个类和功能,可以像 snp 一样,直接引入中间变量扩展即可,如果我们的扩展了多个分类,而隶属于一个模块,那么可以模仿 Kingfisher,让我们的功能更清晰

以上就是Swift SnapKit模仿Kingfisher第三方扩展优化示例的详细内容,更多关于SnapKit第三方扩展的资料请关注脚本之家其它相关文章!

相关文章

  • swift 错误处理do catch try try!使用详解

    swift 错误处理do catch try try!使用详解

    这篇文章主要介绍了swift 错误处理do catch try try!使用详解的相关资料,需要的朋友可以参考下
    2023-03-03
  • Combine中错误处理和Scheduler使用详解

    Combine中错误处理和Scheduler使用详解

    这篇文章主要为大家介绍了Combine中错误处理和Scheduler使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Swift Set集合及常用方法详解总结

    Swift Set集合及常用方法详解总结

    Set集合为集类型,集是最简单的一种集合,存放于集中的对象不按特定方式排序,只是简单地把对象加入集合中,类似于向口袋里放东西,对集中存在的对象的访问和操作是通过对象的引用进行的,因此在集中不能存放重复对象
    2021-11-11
  • Swift实现简单计算器项目

    Swift实现简单计算器项目

    这篇文章主要为大家详细介绍了Swift实现简单计算器项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Swift类和对象的底层探索分析

    Swift类和对象的底层探索分析

    这篇文章主要为大家介绍了Swift类和对象的底层探索分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Swift协议Protocol介绍

    Swift协议Protocol介绍

    协议规定了用来实现某一特定功能所必需的方法和属性。任意能够满足协议要求的类型被称为遵循(conform)这个协议。类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能
    2022-08-08
  • 详解Swift的内存管理

    详解Swift的内存管理

    这篇文章主要介绍了Swift的内存管理,对内存管理感兴趣的同学,可以参考下
    2021-04-04
  • swift实现自动轮播图效果(UIScrollView+UIPageControl+Timer)

    swift实现自动轮播图效果(UIScrollView+UIPageControl+Timer)

    这篇文章主要为大家详细介绍了swift实现自动轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Swift使用WKWebView在iOS应用中调用Web的方法详解

    Swift使用WKWebView在iOS应用中调用Web的方法详解

    这篇文章主要介绍了Swift使用WKWebView在iOS应用中调用Web的方法详解,使用WKWebView便等于使用和Safari中相同的JavaScript解释器,用来替代过去的UIWebView,需要的朋友可以参考下
    2016-04-04
  • Swift开发中switch语句值绑定模式

    Swift开发中switch语句值绑定模式

    本文给大家分享Swift开发中switch语句值绑定模式,非常不错,具有参考借鉴价值,需要的的朋友参考下
    2016-12-12

最新评论