Swift3.0朝圣之路-Then協議庫-絕妙的初始化方式

昨天看了公眾號SwiftGG翻譯組的文章《Swift:讓人眼前一亮的初始化方式》,自己動手敲了一篇,只能說,手感真特么爽。

先看看比較普通的寫法,最普通的就不說了,先看這種通過Block創建對象的寫法,優點:代碼整合在一個閉包里面,可讀性強。

        let _ = { () -> UILabel in
            let label = UILabel()
            view.addSubview(label)
            label.text = "myLabel"
            label.font = UIFont.systemFont(ofSize: 18)
            label.center = self.view.center
            label.bounds = CGRect.init(x: 0, y: 0, width: 100, height: 50)
            return label
        }()

但如果要在一個ViewDidLoad創建多個Label呢,那多個閉包里面怎么給相應的Label命名呢?都叫label還是不同的命名呢?這是強迫癥和選擇困難癥并發的節奏。
接著看下面的寫法,在Block外初始化一個對象,再傳進閉包進行設值,統一用$0取參數對象,不用再去煩如何命名了。當然也可以命名,參考后文的寫法 不過有個缺點:里面的$0沒法自動聯想出屬性,手敲幾行代碼你就會藍瘦香菇

        let _: UILabel = {
            view.addSubview($0)
            $0.text = "測試"
            $0.font = UIFont.systemFont(ofSize: 18)
            $0.center = self.view.center
            $0.bounds = CGRect.init(x: 0, y: 0, width: 100, height: 50)
            return $0
        }(UILabel())

大概理解上面的代碼后,接著再看使用Then協議庫的初始化寫法,比上面的代碼更簡潔,不用寫return了,而且里面的$0還能自動聯想。優點:暫時沒有吐槽點

        // 1.0 帶參數,可自行命名
        let  _ = UILabel().then_Any { (label) in
            label.backgroundColor = .blue
            label.font = UIFont.systemFont(ofSize: 18)
            label.textAlignment = .center
            label.text = "Then協議庫寫法_1.0"
            label.frame = CGRect.init(x: 20, y: 200, width: 150, height: 40)
            
            // 不會循環引用(已測試)
            self.view.addSubview(label)
        }
        
        // 1.1 (推薦)無參數,無需命名,用$0取參數,可自動聯想屬性(推薦)
        let _ = UILabel().then_Any {
            $0.backgroundColor = .blue
            $0.font = UIFont.systemFont(ofSize: 18)
            $0.textAlignment = .center
            $0.text = "Then庫寫法_1.1"
            $0.frame = CGRect.init(x: 200, y: 260, width: 150, height: 40)
            self.view.addSubview($0)
        }

        // 2.0 帶參數,可自行命名
        let label_AnyO = UILabel().then { (label) in
            label.backgroundColor = .blue
            label.font = UIFont.systemFont(ofSize: 18)
            label.textAlignment = .center
            label.text = "Then庫寫法_2.0"
            label.frame = CGRect.init(x: 200, y: 260, width: 150, height: 40)
        }
        self.view.addSubview(label_AnyO)
        
        
        // 2.1 (推薦)無參數,無需命名,用$0取參數,可自動聯想屬性
        let _ = UILabel().then {
            $0.backgroundColor = .blue
            $0.font = UIFont.systemFont(ofSize: 18)
            $0.textAlignment = .center
            $0.text = "Then庫寫法_2.1"
            $0.frame = CGRect.init(x: 200, y: 260, width: 150, height: 40)
            self.view.addSubview($0)
        }

    ///  栗子:某工廠方法 
    class func label(withFrame frame: CGRect, text: String?, font: UIFont) -> UILabel {
        return UILabel.init(frame: frame).then(block: { (label) in
            label.text = text
            label.textColor = UIColor.black
            label.backgroundColor = UIColor.white
            label.font = font
        })
    }

其實Then協議庫只有十幾行代碼,但是能帶來非常好的體驗感,簡約實用,不會出現循環引用。下面的代碼可以復制到一個swift file中,直接用。

import Foundation

public protocol Then {}

extension Then where Self: Any {
    public func then_Any( block: (inout Self) -> Void) -> Self {
        var copy = self
        block(&copy)
        return copy
    }
}

extension Then where Self: AnyObject {
    public func then( block: (Self) -> Void) -> Self {
        block(self)
        return self
    }
}

extension NSObject: Then {}


我所有Swift3.0練習Demo都放到了Github上,并且在不斷更新。
Swift3.0朝圣之路-全集地址

  1. Swift3.0閉包的使用詳解,簡單封裝GET/POST網絡請求
  2. WKWebView的使用詳解,包括JS交互
  3. 原來MapKit的簡單使用,包括定位+地圖+地理編碼
  4. OC+Swift混編,介紹高德地圖SDK的簡單使用,包括定位+地圖+POI搜索+導航+UISearchController使用
  5. 協議代理的基礎用法
  6. 分類/類別的使用和封裝
  7. 【Then協議庫】-眼前一亮的初始化方式
  8. 使用Runtime在分類Extension中添加屬性
  9. 封裝UIAlertController
  10. 自定義相冊【尚未完成】
  11. 用原生框架掃描、識別二維碼圖片,生成黑白色、彩色二維碼圖片
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 因為要結局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細...
    uniapp閱讀 4,447評論 0 12
  • 媽 孩子不孝 今年的母親節又無法陪伴 我駐守在祖國的邊疆 保衛著邊防人民的安全 卻無法給您過一次節日 媽 您恨我嗎...
    咿呀涵丫閱讀 190評論 9 6
  • 手中無墨的鋼筆, 隔夜的茶, 沉默的日子里, 為明日的期待, 鋪上一張平整的油紙, 你是唯一的褶皺, 在我筆尖, ...
    光洋閱讀 259評論 0 0
  • 1 最近,花了一萬...
    路人隨想閱讀 403評論 0 0
  • 買了差不多一年的遠大智能今天終于漲停了,自去年買了它,沒有隨大盤上漲,一直橫盤,在大盤下調時,它又創了新低。 當初...
    博鯤閱讀 331評論 0 0