Swift心得筆記之運算子_Swift

來源:互聯網
上載者:User

空值合并運算子和區間運算子

今天主要看的內容是 Swift 中的基本運算子。記錄一下。

Nil Coalescing Operator

a ?? b 中的 ?? 就是是空值合并運算子,會對 a 進行判斷,如果不為 nil 則解包,否則就返回 b 。

var a: String? = "a"var b: String? = "b"var c = a ?? b   // "a"a = nilc = a ?? b     // "b"b = nilc = a ?? b ?? "c"  // "c"

使用的時候有以下兩點要求:

a 必須是 optional 的
b 必須和 a 類型一致
也就是說,a 一定要有被備胎的可能,b 一定要有做備胎的資格。

其實也就是對三目運算子的簡寫:

複製代碼 代碼如下:

a != nil ? a! : b 或者 a == nil ? b : a!

當然你也可以通過自訂運算子來實現:

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

區間運算子分為閉區間 (...) 和左閉右開區間 (..<) 兩種,前者是算頭算尾,後者是算頭不算尾。

可以應用在 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")}

區間運算子其實返回的是一個 Range<T> 對象,是一個連續無關聯序列索引的集合。

話說以前左閉右開是 .. ,這樣和 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...4var generator = range.generate()  // {startIndex 1, endIndex 5}generator.next() // 1generator.next() // 2generator.next() // 3generator.next() // 4generator.next() // nil

.generate() 返回一個 RangeGenerator<T> 的結構體,可以用來遍曆 Range<T> 中的值。

以前還有個 (5...1).by(-1) 的用法,不過現在好像沒用了。

區間運算子返回的是一個 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 就可以了,然後下標的類型是 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"

如果要搜尋目標字串之後再截取 substring 可以這樣:

let name = "Joris Kluivers"let start = name.startIndexlet end = find(name, " ")if (end != nil) {  let firstName = name[start..<end!]} else {  // no space found}

以上所述就是本文的全部內容了,希望大家能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.