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
}
}
相關文章
- 運算子-賦值運算子賦值
- 賦值運算子(轉)賦值
- JavaScript 等號 = 賦值運算子JavaScript賦值
- 1:賦值運算子函式賦值函式
- 按位“或”賦值運算子 (|=)賦值
- Python學習-算術運算子,賦值運算子和複合運算子Python賦值
- 8.Golang中的運算子-算術運算子、關係運算子、邏輯運算子、賦值運算子Golang賦值
- javascript運算子——條件、逗號、賦值、()和void運算子JavaScript賦值
- javascript賦值運算子等號=深入介紹JavaScript賦值
- javascript基礎(賦值運算子,關係運算子,相等運算子,三元運算子,運算子的優先順序,程式碼塊)(十)JavaScript賦值
- Python 賦值與運算子和連線符Python賦值
- ECMAScript 安全賦值運算子 (?=) 提案介紹及其 Polyfill賦值
- Kotlin 運算子詳解:算術、賦值、比較與邏輯運算子全解析Kotlin賦值
- Python中“+=”指什麼?賦值運算子包括哪些?Python賦值
- 賦值運算子和+號的用法(兩個練習)賦值
- java零基礎自學第一天②,運算子:表示式,算術運算子,+操作,賦值運算子,自增自減運算子,關係運算子,邏輯運算子,三元運算子Java賦值
- 劍指Offer--面試題1:賦值運算子函式面試題賦值函式
- 第十八篇:複製控制( 中 ) --- 過載賦值運算子賦值
- VS2005入門之運算子[賦值,算術]賦值
- awk 系列:怎樣使用 awk 變數、數值表示式以及賦值運算子變數賦值
- 帶複製建構函式、賦值運算子的模板佇列函式賦值佇列
- ES6-解構賦值,語義增強,擴充套件運算子賦值套件
- C++ 禁用類的複製建構函式和賦值運算子C++函式賦值
- js運算子優先順序及賦值運算var a = {n:1};var b = a;a.x = a = {n:2};JS賦值
- 配置 babel 支援物件擴充套件運算子、class 直接賦值變數等新特性Babel物件套件賦值變數
- 運算子 運算子
- 使用解構賦值與擴充套件運算子,讓你的程式碼更優雅賦值套件
- php運算子 比較運算子 邏輯運算子 三元運算子PHP
- 第九章:過載賦值運算子中需要注意的兩個問題賦值
- MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)MySql
- javascript運算子——邏輯運算子JavaScript
- 運算子的關係,什麼叫一元運算子,二元運算子,三元運算子,運算子優先順序,以及運算子的
- 運算子
- javascript中&&運算子和||運算子的使用JavaScript
- 算術運算子裡的特殊運算子
- php運算子運用之型別運算子該如何使用PHP型別
- Python 運算子優先順序 運算子Python
- C++ 迭代器運算子 箭頭運算子->C++