swiftSwiftSwift

iOS - Swift协议库Then的用法

2022-04-15  本文已影响0人  俺不是大佬儿

最近在学习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}{若有理解错误的地方欢迎大佬儿来指正纠错,共同学习😏!!}

上一篇下一篇

猜你喜欢

热点阅读