Swift重構(gòu)自定義空等運(yùn)算符 “??=” 實(shí)例
一、思路來(lái)源
最近在做 Flutter 開(kāi)發(fā)時(shí)發(fā)現(xiàn)一個(gè)之前沒(méi)注意到的空等運(yùn)算符 “??=”,代表左邊為空時(shí),才會(huì)把右邊的值賦給左邊,然后返回左邊的變量值;常用于避免多次賦值的情況;發(fā)現(xiàn)非常實(shí)用,于是給 swift 也自定義一個(gè)使用,最終如下;
二、示例
b1 獲取 a1 的值,a1 如果不為空直接返回;為空則賦值;
var a1: UIView?; let b1 = a1 ??= UITableView(); print("a1: \(a1)");//a1: Optional(<UITableView: 0x7feda0830600; print("b1: \(b1)");//b1: <UITableView: 0x7feda0830600
等同于:
var a1: UIView?; if(a1 == nil) { a1 = UITableView(); } let b1 = a1;
可以讓我們少寫(xiě)一行代碼;
三、源碼
precedencegroup NilEqualPrecedence { /// 優(yōu)先從左向右, left, right or none associativity: left higherThan: AssignmentPrecedence//優(yōu)先級(jí),比等號(hào)運(yùn)算符高 // lowerThan: AdditionPrecedence // 優(yōu)先級(jí), 比...低 assignment: true // 是否是賦值運(yùn)算 } /// 空等運(yùn)算符聲明 infix operator ??=: NilEqualPrecedence /// 空等運(yùn)算符實(shí)現(xiàn) func ??= <T>(lhs: inout T?, rhs: T) -> T { if lhs == nil { lhs = rhs; } return lhs!; }
四、總結(jié)
Swift 最令人興奮的特性之一(盡管也有爭(zhēng)議)是自定義運(yùn)算符的能力。
在您自己的代碼中重寫(xiě)或定義新運(yùn)算符時(shí),請(qǐng)確保遵循以下準(zhǔn)則:
- 不要?jiǎng)?chuàng)建運(yùn)算符,除非它的含義是顯而易見(jiàn)且無(wú)可爭(zhēng)議的。查找任何潛在的沖突以確保語(yǔ)義一致性。
- 注意自定義算子的優(yōu)先級(jí)和關(guān)聯(lián)性,只根據(jù)需要定義新的算子組。
- 如果有意義,請(qǐng)考慮為自定義運(yùn)算符實(shí)現(xiàn)分配變體。
編程工作的核心是創(chuàng)造。創(chuàng)造一切我們需要而沒(méi)有的函數(shù)、工具、腳本...
以上就是Swift重構(gòu)自定義空等運(yùn)算符 “??=” 實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于Swift重構(gòu)自定義空等運(yùn)算符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Swift開(kāi)發(fā)之UITableView狀態(tài)切換效果
這篇文章主要介紹了Swift開(kāi)發(fā)之UITableView狀態(tài)切換效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Swift中通過(guò)疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法
這篇文章主要介紹了Swift中通過(guò)疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法的相關(guān)資料,需要的朋友可以參考下2016-08-08RxSwift學(xué)習(xí)之Observable的新建、訂閱及取消訂閱
這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之Observable的相關(guān)資料,文中詳細(xì)的給大家介紹了關(guān)于新建Observable、訂閱Observable和取消訂閱并消除內(nèi)存泄漏等相關(guān)的內(nèi)容,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09