If-Let 賦值運算符

作者:Weston Hanners,原文鏈接,原文日期:2015-10-29
譯者:pmst;校對:千葉知風;定稿:千葉知風

(AKA:你希望使用一個自定義操作符)

有多少次你是以這種匹配模式實現的呢?

if let value = someOptionalValue as? String {
  self.value = value
}

我一直使用這種方式進行JSON數據解析或者NSCoding的實現。但我覺得這對于Swift來說有點啰嗦,堅信肯定存在某種更好的方式。

NSHipster提出自定義邏輯或賦值運算符(||=),這看起來很不錯。不管怎樣,它似乎還未為泛型實現(作者:如果這里我理解錯了,請告訴我).我想我可以先試一試...

infix operator ||= { associativity right precedence 90 }

// 譯者注: 測試只有加上<T>才能正常運行
func ||= <T>(inout left: T, right: T?) {
    if let right = right {
        left = right
    }
}

實際上它能夠很好地工作,我將原代碼簡化如下:

self.value ||= someOptionalValue as? String

或許這有點微不足道,但是當你需要連續處理一系列任務時,這節省了大量代碼,變得更具可讀性。

還有件事...我依然嘗試去弄清楚這是怎么回事,但我最終定義了第二個方法用于可選類型賦值。而唯一的不同是現在左側參數類型為T?

func ||= <T>(inout left: T?, right: T?) { // The left param is now Optional
    if let right = right {
        left = right
    }
}

var someOptionalString: String?

someOptionalString ||= newValue // Will assign when newValue is not optional

如果你有興趣看看這個,請點擊Playground下載。

溫馨提示: 文章測試環境是Swift2.0。

更新日志 11/01/2015:

twitter上有人提醒我: ruby中||=等價于left = left || right,與我想要實現的left = right || left不同。我對這種用法不是很了解,為了避免混淆,我可能使用另外一個操作符?=替代。

infix operator ?= { associativity right precedence 90 }

func ?=<T>(inout left: T, right: T?) {
    if let value = right {
        left = value
    }
}

func ?=<T>(inout left: T?, right: T?) {
    if let value = right {
        left = value
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容