Swift心得筆記之運(yùn)算符
空值合并運(yùn)算符和區(qū)間運(yùn)算符
今天主要看的內(nèi)容是 Swift 中的基本運(yùn)算符。記錄一下。
Nil Coalescing Operator
a ?? b 中的 ?? 就是是空值合并運(yùn)算符,會對 a 進(jìn)行判斷,如果不為 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"
使用的時(shí)候有以下兩點(diǎn)要求:
a 必須是 optional 的
b 必須和 a 類型一致
也就是說,a 一定要有被備胎的可能,b 一定要有做備胎的資格。
其實(shí)也就是對三目運(yùn)算符的簡寫:
a != nil ? a! : b 或者 a == nil ? b : a!
當(dāng)然你也可以通過自定義運(yùn)算符來實(shí)現(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# 中也有個(gè) ?? ,感興趣的可以去了解一下。
Range Operator
區(qū)間運(yùn)算符分為閉區(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ū)間運(yùn)算符其實(shí)返回的是一個(gè) Range<T> 對象,是一個(gè)連續(xù)無關(guān)聯(lián)序列索引的集合。
話說以前左閉右開是 .. ,這樣和 Ruby 的就剛好完全相反了。。。
不過有人就是想用 .. ,那么可以這樣自己寫一個(gè):
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() 返回一個(gè) RangeGenerator<T> 的結(jié)構(gòu)體,可以用來遍歷 Range<T> 中的值。
以前還有個(gè) (5...1).by(-1) 的用法,不過現(xiàn)在好像沒用了。
區(qū)間運(yùn)算符返回的是一個(gè) 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 中用點(diǎn)點(diǎn)點(diǎn)來獲取 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] 這種方法怎么辦呢?
自己動手豐衣足食,寫個(gè) extension 吧,只需要加個(gè) 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中使用Cocoa的現(xiàn)有設(shè)計(jì)模式介紹
這篇文章主要介紹了在Swift中使用Cocoa的現(xiàn)有設(shè)計(jì)模式介紹,Cocoa是蘋果公司為Mac OS X所創(chuàng)建的原生面向?qū)ο蟮腁PI,是Mac OS X上五大API之一,需要的朋友可以參考下2014-07-07
Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法
這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03
Swift?中的?Actors?使用及如何防止數(shù)據(jù)競爭問題(示例詳解)
Swift中的Actors旨在完全解決數(shù)據(jù)競爭問題,但重要的是要明白,很可能還是會遇到數(shù)據(jù)競爭,本文將介紹Actors是如何工作的,以及你如何在你的項(xiàng)目中使用它們,感興趣的朋友跟隨小編一起看看吧2023-06-06
swift實(shí)現(xiàn)顏色漸變以及轉(zhuǎn)換動畫
這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)顏色漸變以及轉(zhuǎn)換動畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Swift使用CoreData時(shí)遇到的一些填坑記錄
這篇文章主要給大家記錄了在Swift使用CoreData時(shí)遇到的一些坑,以及介紹了CoreData在Swift 3.0中的一點(diǎn)改變,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-12-12

