iOS - Swift协议库Then的用法

最近在学习Swift开发项目,一些常用的第三方库也在尝试使用,好的类库可以提高代码质量开拓编程思路,今天分享Then初始化库

原理:定义了一个Then协议,对Then协议进行扩展并指定约束范围为AnyObject、Any并利用闭包地形式在类实例、结构体实例初始化时返回了实例本身,由于库中让NSObject遵循Then协议所以对所有继承自NSObject的类型初始化都可用

用法

1.无需名参数使用$0替代

    private lazy var searchBtn = UIButton().then {
        $0.setImage(UIImage(named: "classify_search_btn"), for: .normal)
        $0.setTitle("忍者", for: .normal)
        $0.setTitleColor(UIColor.white, for: .normal)
        $0.titleLabel?.font = UIFont.systemFont(ofSize: 13)
        $0.titleLabel?.textAlignment = NSTextAlignment.left
        $0.backgroundColor = UIColor(r: 1, g: 1, b: 1, a: 0.5)
        $0.backgroundColor = .theme_color
    }
在闭包外初始化一个searchBtn对象,再传进闭包进行设值,统一用取参数$0代替对象searchBtn

2.显式命名参数

    private lazy var VIPBtn = UIButton().then { btn
        in
        btn.imagePosition(style: .left, spacing: 3.0)
        btn.setImage(UIImage(named: "home_2_default"), for: .normal)
        btn.setTitle("VIP", for: .normal)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = .systemFont(ofSize: 14)
    }

正常在使用lazy进行懒加载的初始化方式需要用下面的形式

    private lazy var VIPBtn: UIButton = {
        let btn = UIButton()
        btn.imagePosition(style: .left, spacing: 3.0)
        btn.setImage(UIImage(named: "home_2_default"), for: .normal)
        btn.setTitle("VIP", for: .normal)
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = .systemFont(ofSize: 14)
        return btn
    }()

需要在闭包中初始化 let btn = UIButton() 并最后return btn

对于储值类型的结构体同样可以使用,用with 协议方法

   let dframe = CGRect().with{
          $0.origin.x = 12
          $0.size.width = 20
    }
  let dframe = CGRect().with { f in
        f.size.width = 10
        f.size.height = 20
        f.origin.x = 30
        f.origin.y = 12
    }

直接在闭包内执行操作

   let usera = UserDefaults.standard.then { u in
        u.set("swift", forKey: "username")
        u.set("study", forKey: "password")
        u.synchronize()
    }
    
    let user = UserDefaults.standard.do {
        $0.set("swift", forKey: "username")
        $0.set("study", forKey: "password")
        $0.synchronize()
    }

\color{gray}{若有理解错误的地方欢迎大佬儿来指正纠错,共同学习😏!!}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通知传值 首先我们来看看通知传值,通知可实现任意界面之间的数据传递,但必须满足一个条件,就是保证在发送通知的时...
    Insit阅读 3,332评论 0 2
  • Swift 协议 1.协议介绍 协议可以用来定义方法、属性、下标的声明,协议可以被枚举、结构体、类遵守(多个协议之...
    Leon_520阅读 1,521评论 1 12
  • Swift简介 一、Swift常用语法 Swift是Apple去年推出的一门新的语言,基于C和Objective-...
    GitHubPorter阅读 3,740评论 1 12
  • 主要总结一些平时遇到的疑难点,在此总结出来,持续更新。可能有些误导大家的地方,欢迎指正。 难点 get,set,w...
    Jimmy木阅读 2,635评论 1 10
  • 引言 本文旨在帮助开发者快速从OC开发过渡到Swift开发,挑选了一些比较浅显的但是比较常用的Swift语法特性,...
    小白进城阅读 5,059评论 6 44