Swift心得筆記之運算符
空值合并運算符和區(qū)間運算符
今天主要看的內(nèi)容是 Swift 中的基本運算符。記錄一下。
Nil Coalescing Operator
a ?? b 中的 ?? 就是是空值合并運算符,會對 a 進行判斷,如果不為 nil 則解包,否則就返回 b 。
var a: String? = "a" var b: String? = "b" var c = a ?? b // "a" a = nil c = a ?? b // "b" b = nil c = a ?? b ?? "c" // "c"
使用的時候有以下兩點要求:
a 必須是 optional 的
b 必須和 a 類型一致
也就是說,a 一定要有被備胎的可能,b 一定要有做備胎的資格。
其實也就是對三目運算符的簡寫:
a != nil ? a! : b 或者 a == nil ? b : a!
當(dāng)然你也可以通過自定義運算符來實現(xiàn):
infix operator ||| {} func |||<T> (left: T?, right: T) -> T { if let l = left { return l } return right } var a:String? var b = "b" var c = a ||| b
C# 中也有個 ?? ,感興趣的可以去了解一下。
Range Operator
區(qū)間運算符分為閉區(qū)間 (...) 和左閉右開區(qū)間 (..<) 兩種,前者是算頭算尾,后者是算頭不算尾。
可以應(yīng)用在 switch 中:
switch aNumber { case 0...5: println("This number is between 0 and 5") case 6...10: println("This number is between 6 and 10") default: println("This number is not between 0 and 10") }
區(qū)間運算符其實返回的是一個 Range<T> 對象,是一個連續(xù)無關(guān)聯(lián)序列索引的集合。
話說以前左閉右開是 .. ,這樣和 Ruby 的就剛好完全相反了。。。
不過有人就是想用 .. ,那么可以這樣自己寫一個:
infix operator .. { associativity none precedence 135} func .. (lhs: Int, rhs: Int) -> Range<Int> { return lhs..<rhs } for i in 0..10 { println("index \(i)") }
你也可以用 generate() 來遍歷:
var range = 1...4 var generator = range.generate() // {startIndex 1, endIndex 5} generator.next() // 1 generator.next() // 2 generator.next() // 3 generator.next() // 4 generator.next() // nil
.generate() 返回一個 RangeGenerator<T> 的結(jié)構(gòu)體,可以用來遍歷 Range<T> 中的值。
以前還有個 (5...1).by(-1) 的用法,不過現(xiàn)在好像沒用了。
區(qū)間運算符返回的是一個 ClosedInterval 或者 HalfOpenInterval 的東西,類型只要是 Comparable 就可以了。所以我們也可以把 String 放到 ... 里。
比如貓神的 Swifter Tips 中有一章的代碼如下,通過 String 的 ClosedInterval 來輸出字符串中的小寫字母:
let test = "Hello" let interval = "a"..."z" for c in test { if interval.contains(String(c)) { println("\(c)") } }
SubString
Ruby 中用點點點來獲取 SubString 的方法很方便:
2.1.3 :001 > a="abc" => "abc" 2.1.3 :002 > a[0] => "a" 2.1.3 :003 > a[0..1] => "ab"
而 Swift 中的 ClosedInterval 是沒有 subscript 的。但是任性的我們就是要用 [1...3] 這種方法怎么辦呢?
自己動手豐衣足食,寫個 extension 吧,只需要加個 subscript 就可以了,然后下標(biāo)的類型是 Range<Int> 就可以了:
extension String { subscript (r: Range<Int>) -> String { get { let startIndex = advance(self.startIndex, r.startIndex) let endIndex = advance(startIndex, r.endIndex - r.startIndex) return self[Range(start: startIndex, end: endIndex)] } } } var s = "Hello, playground" println(s[0...5]) // ==> "Hello," println(s[0..<5]) // ==> "Hello"
如果要搜索目標(biāo)字符串之后再截取 substring 可以這樣:
let name = "Joris Kluivers" let start = name.startIndex let end = find(name, " ") if (end != nil) { let firstName = name[start..<end!] } else { // no space found }
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Swift內(nèi)置的數(shù)字類型及基本的轉(zhuǎn)換方法
這篇文章主要介紹了Swift內(nèi)置的數(shù)字類型及基本的轉(zhuǎn)換方法,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-11-11SwiftUI 中創(chuàng)建反彈動畫的實現(xiàn)
這篇文章主要介紹了SwiftUI 中創(chuàng)建反彈動畫的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)
這篇文章主要為大家介紹了Swift之for循環(huán)的基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06Swift實現(xiàn)Selection Sort選擇排序算法的實例講解
選擇排序是一種穩(wěn)定的排序算法,且實現(xiàn)代碼通常比冒泡排序要來的簡單,這里我們就來看一下Swift實現(xiàn)Selection Sort選擇排序的實例講解2016-07-07Swift中內(nèi)置的集合類型學(xué)習(xí)筆記
Swift中自帶數(shù)組、set、字典三大集合類型,這里將學(xué)習(xí)過程中的基礎(chǔ)的Swift中內(nèi)置的集合類型學(xué)習(xí)筆記進行整理,需要的朋友可以參考下2016-06-06在一個項目中同時使用Swift和Objective-C代碼混合編程的方法
這篇文章主要介紹了在一個項目中同時使用Swift和Objective-C代碼的方法,在一個工程中同時使用Swift和Objective-C混合語言編程的方法,需要的朋友可以參考下2014-07-07SwiftUI開發(fā)總結(jié)combine原理簡單示例詳解
這篇文章主要為大家介紹了SwiftUI開發(fā)總結(jié)combine原理簡單示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02