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

目录
  • 正文
    • 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第三方扩展的资料请关注我们其它相关文章!

(0)

相关推荐

  • IOS 开发之swift中UIView的扩展使用的实例

    IOS 开发之swift中UIView的扩展使用的实例 扩展类代码: import UIKit extension UIView { // MARK : 坐标尺寸 var origin:CGPoint { get { return self.frame.origin } set(newValue) { var rect = self.frame rect.origin = newValue self.frame = rect } } var size:CGSize { get { return

  • Swift中图片资源使用流程的优化方法详解

    前言 去年发布的Xcode9支持在代码编辑中直接插入图片,类似如下效果 但用了一段时间以后还是不太喜欢,换回了原来的方法. 本篇中许多实现细节已经在 iOS中多语言本地化流程的优化中写过,没再重复,若有疑问建议先阅读该文章. 传统的方法 // iOS let closeImage = UIImage(named: "close") // macOS let closeImage = NSImage(named: NSImage.Name("close")) 是不是看

  • Swift中的限定扩展详析

    前言 现在很多公司的iOS新项目都开始用Swift来代替OC开发了,Swift带来的亮点和新功能很多,但我觉得最重要的一点是引导我们编程思想的改变,将我们在OC中用到的传统的面向对象编程思想OOP(object-oriented programming)向面向协议编程思想POP(protocol oriented programming)以及面向值的编程思想VOP(value-oriented programming)上转变,苹果也让我们开发者在编程的时候"从一个protocol开始,别从一个c

  • SwiftUI List在MacOS中的性能优化示例

    引言 List在iOS中有懒加载的特性,但是在MacOS中会一次性加载完List中的所有的数据.并没有懒加载的特性. 所以在MacOS的List中当数据量巨大时,会存在巨大的性能瓶颈. var body: some View { List(){ ForEach(currentSectionModel) { (sectionModel) in Section(header: HStack { Text("section")+Text(sectionModel.word).font(.ti

  • Swift图像处理之优化照片

    Core Image能通过分析图片的各个属性,人脸的区域等进行自动优化图片.我们只需要调用autoAdjustmentFiltersWithOptions这个API方法获取各个自动增强滤镜来优化图片即可.不管是人物照片还是风景照均可增强效果. (以前另外还有个叫autoAdjustmentFilters的方法,现已废除.) 1.具体使用的滤镜如下: (1)CIRedEyeCorrection:修复因相机的闪光灯导致的各种红眼 (2)CIFaceBalance:调整肤色 (3)CIVibrance

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

    目录 正文 SnapKit扩展方式简要思考 Kingfisher扩展方式简要思考 自行模仿尝试 最后 正文 我们平时用swift写第三方扩展(OC中的分类)时,可能会直接就往扩展里面写方法,简单又方便,然而当我们看一些常用你的三方(例如:Kingfisher.SnapKit)等,都会用一个简单的参数引出(例如:kf.snp),下面来探索一下怎么用的,然后在总结其优缺点 SnapKit扩展方式简要思考 以 SnapKit为例,使用如下,发现引入了 snp var iv = UIImageView(

  • ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】

    本文实例讲述了ThinkPHP5.0框架验证码功能实现方法.分享给大家供大家参考,具体如下: 背景 ThinkPHP5.0 已经出现很久了,最近有所接触,下面介绍一下常用的第三方验证码功能的使用. ♜ 功能开发 1).引入第三方扩展包 进行 TP5 的开发,Composer 的使用会成为重要技能,以 windows 为例子,输入命令: composer require topthink/think-captcha 完成上述操作,会在以下目录中出现 captcha 的扩展包 ..\vendor\t

  • vscode 安装go第三方扩展包填坑记录的详细教程

    1.vscode中安装go扩展包,不再阐述. 2.在安装好go的扩展包以后,创建GOPATH环境变量 3.PATH中会自动添加,如果没有可手动添加 4.在GOPATH目录下创建自己的工作空间(为什么一定是在GOPATH下创建,还不太清楚),我的是workspace(名称可以自定义) 5.打开VSCODE,文件-打开文件夹,选择GOPATH目录 6.在workspace下创建helloworld目录(我称为项目空间) 7.配置VSCODE中的setting.json文件 加入如下配置: 8.编写h

  • Swift 3.0基础学习之扩展

    介绍 扩展可以为类,结构体,枚举和协议添加新的功能.包括可以对没有源码访问权限的类型进行扩展.扩展和 Objective-C 分类 的概念类似.(和 Objective-C 的分类不一样的是,Swift 扩展没有名称). 在 Swift 中,扩展可以做到: 添加计算的实例属性和计算的类型属性 定义实例方法和类型方法 提供新的初始化器 定义下标 定义并使用新的嵌套类型 使现有类型符合协议 值得注意的是:扩展可以为类型添加功能,但是不可以重写现有的功能. 扩展语法 使用关键字 extension 定

  • Swift 4最全的新特性详细解析(推荐)

    引言 Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.Swift吸收了众多现代编程语言的优点,尽力的提供简洁的编程语言和强大的功能. WWDC 2017 给大家带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特性非常值得我们期待在正式项目中去使用它.因为 Swift 4 是开源的,如果你关注 swift-evolution 这个项目的

  • 浅谈webpack 构建性能优化策略小结

    背景 如今前端工程化的概念早已经深入人心,选择一款合适的编译和资源管理工具已经成为了所有前端工程中的标配,而在诸多的构建工具中,webpack以其丰富的功能和灵活的配置而深受业内吹捧,逐步取代了grunt和gulp成为大多数前端工程实践中的首选,React,Vue,Angular等诸多知名项目也都相继选用其作为官方构建工具,极受业内追捧.但是,随者工程开发的复杂程度和代码规模不断地增加,webpack暴露出来的各种性能问题也愈发明显,极大的影响着开发过程中的体验. 问题归纳 历经了多个web项目

  • PHP安全配置优化详解

    由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患.从配置选项来看,可以做如下的优化. 1.屏蔽PHP错误输出. 在/etc/php.ini(默认配置文件位置),将如下配置值改为Off display_errors=Off 不要将错误堆栈信息直接输出到网页上,防止黑客加以利用相关信息. 正确的做法是: 把错误日志写到日志文件中,方便排查问题. 2.屏蔽PHP版本. 默认情况下PHP版本会被显示在返回头里,如: Response Headers X-powered-by: PHP/7

  • CI框架教程之优化验证码机制详解【验证码辅助函数】

    本文实例讲述了CI框架教程之优化验证码机制.分享给大家供大家参考,具体如下: 验证码机制在CI框架中是通过一个辅助函数captcha()进行实现的--验证码辅助函数文件包含了一些帮助你创建验证码图片的函数.. 那么我们如何使用CI的captcha()辅助函数来完成验证码功能呢?下面我会先讲述如何使用CI的captcha()辅助函数来完成验证码功能,然后在讲述如何具体的对CI框架的验证码机制进行优化. 1.CI框架验证码功能的使用 a)  首先我们要先加载辅助函数 加载辅助函数一共有两种方法: ①

  • webpack优化的深入理解

    前言 由于前端的快速发展,相关工具的发展速度也是相当迅猛,各大框架例如vue,react都有自己优秀的脚手架工具来帮助我们快速启动一个新项目,也正式因为这个原因,我们对于脚手架中最关键的一环webpack相关的优化知之甚少,脚手架基本上已经为我们做好了相关的开发准备,但是当我们想要做一些定制化的优化操作时,对webpack的优化也需要有一定的了解,否则无从下手,接下来就让我们进入webpack的优化世界 构建速度提升 loader提升 loader是webpack中最重要的特性,由于webpac

  • VSCode配置Go插件和第三方拓展包的详细教程

    前言 VSCode现在已经发展的相当完善,很多语言都比较推荐使用其来编写,Go语言也一样,前提你电脑已经有了Go环境和最新版本的VSCode 插件安装 直接在拓展插件中搜索Go,就可以安装Go插件 安装之后vscode会弹出该插件还需安装一些扩展工具支持,但是这些工具往往会下载失败,或者仅仅成功一部分 比如: Installing github.com/nsf/gocode FAILED Installing github.com/uudashr/gopkgs/cmd/gopkgs FAILED

随机推荐