美文网首页swiftSwiftSwift
iOS - Swift协议库Then的用法

iOS - Swift协议库Then的用法

作者: 俺不是大佬儿 | 来源:发表于2022-04-15 23:16 被阅读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}{若有理解错误的地方欢迎大佬儿来指正纠错,共同学习😏!!}

    相关文章

      网友评论

        本文标题:iOS - Swift协议库Then的用法

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