成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Swift中 Nil Coalescing 運算符的使用技巧

移動開發 iOS
在Swift官方《The Swift Programming Language》文檔 Beta 5 版本中的 Basic Operators 一節中添加了Nil Coalescing Operator小結,介紹了一個新的運算符Nil Coalescing,符號是 ?? ,它的表現形成如下:

在Swift官方《The Swift Programming Language》文檔 Beta 5 版本中的 Basic Operators 一節中添加了Nil Coalescing Operator小結,介紹了一個新的運算符Nil Coalescing,符號是 ?? ,它的表現形成如下:

  1. let c = a ?? b 

這個運算符有兩個條件:

a. 必須是Optional類型的。

b. 的類型必須要和a解包后的值類型一致。

符合這兩個條件后,我們來解釋一下上述這行代碼,意思就 是c 的值是 a 或 b 中一個的值,但有前提條件,就是當 a 解包后值不為 nil 時,那么就將 a 解包后的值賦值給 c,如果 a 解包后值為 nil,那么就將 b 的值賦值給c。

我們還可以用三目運算來更形象的解釋這個運算符:

  1. let c = a != nil ? a! : b 

從上面的代碼我們很容易理解,當a的值不等于nil時,將a解包后的值賦值給c,否則將b的值賦值給c。

我們來看看官方給的代碼示例:

  1. let defaultColorName = "red" 
  2.     var userDefinedColorName: String?   // 默認值為nil 
  3.     var colorNameToUse = userDefinedColorName ?? defaultColorName 
  4.     // 因為userDefinedColorName的值是nil,所以colorNameToUse的值為"red"
  1. userDefinedColorName = "green" 
  2.     colorNameToUse = userDefinedColorName ?? defaultColorName 
  3.     // 因為userDefinedColorName的值不為nil,所以colorNameToUse的值為"green" 

大家看到這應該對 Nil Coalescing 這個運算符有比較清晰的理解了,但在實際運用中,我們還需要注意以下幾點。

編譯器中的類型匹配原則

原諒我在末尾加的 ; ,編碼習慣而已 = =||

我們先來看一段代碼:

  1. let a: Int? = nil; 
  2.     let b: Int? = 7; 
  3.  
  4.     let c = a != nil ? a! : b; // 因為a的默認值為nil,所以c的值為{Some 7} 
  5.     let d = a ?? b; // 這里d的值為nil,這是怎么回事?

首先我們需要注意的是,在官方文檔中有這么一句話:“The expression b must match the type that is stored inside a”。但是上面的代碼示例中,我們的 b 是 Int? 類型,那么此時我們的編譯器會怎么處理呢?我們通過自己實現一個 Nil Coalescing 運算符來說明,代碼片段如下:

  1. infix operator ??? { 
  2.         associativity right; 
  3.         precedence 110; 
  4.     } 
  5.  
  6.     func ???<T>(a: T?, b: @autoclosure () -> T) -> T { 
  7.         return a != nil ? a! : b(); 
  8.     } 
  9.  
  10.     let d = a ??? b; // 這里d的值仍然是nil 

從上面的代碼片段中我們可以看出,a的類型是根據傳入的b的類型決定的,所以當我們傳入的 b 是 Int? 類型時,編譯器其實將 a 的類型自動轉換為 Int?? 類型了,也就是 Optional(a) ,那么我們就能解釋 let d = a ?? b; 這行代碼。因為 a == nil 但是 Optional(a) != nil,所以 d = Optional(a)! ,d 的值為 nil 。

Nil Coalescing 運算符返回值的類型

我們先看示例代碼片段:

  1. let a: Int? = nil; 
  2.     let b: Int? = 5; 
  3.     let c: Int? = 6; 
  4.  
  5.     // 因為a的默認值為nil,所以將b的值賦值給x,x的值為{Some 5},類型為Int? 
  6.     let x = a != nil ? a! : b; 
  7.     // 因為c的值不為nil,所以將c解包后的值賦值給y,但是y的值卻是{Some 6},而不是6,這是怎么回事? 
  8.     let y = c != nil ? c! : b; 

根據上面我們提到的編譯器中類型判斷的原則就可以理解了,因為b的類型是Int?,所以在編譯時 c 的類型已經成了 Int?? ,所以為 Int?? 解包的類型就是 Int? 了。

如果我們聲明變量 y 的類型,編譯器就要提出抗議了:

  1. // 如何a為Int?類型,那么編譯器就不會通過,因為會導致賦值運算符兩邊類型不等 
  2.     let x: Int = a != nil ? a! : b; 
  3.   
  4.     // 這種寫法和上面一樣,都不會編譯通過 
  5.     let y: Int = a ?? b;
責任編輯:chenqingxiang 來源: cocoachina
相關推薦

2022-09-07 00:04:37

JavaScript運算符技巧

2021-07-12 15:35:56

JavaScript代碼運算符

2010-01-19 15:30:44

VB.NET比較運算符

2025-02-24 11:16:20

2009-08-11 15:51:08

C#運算符算術運算符

2025-03-05 09:37:03

2020-06-05 14:11:21

Swift運算符代碼

2021-05-07 06:27:29

JavaScript運算符開發

2023-03-01 15:18:01

JavaScripttypeof運算符

2009-08-12 15:20:18

C#賦值運算符復合賦值運算符

2023-04-10 08:58:13

C#關系運算符

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2009-11-18 09:37:31

PHP邏輯運算符

2009-11-18 09:02:55

PHP運算符

2010-03-16 11:20:38

Python格式化

2009-11-26 11:12:07

PHP運算符

2018-12-14 10:00:16

BashLinux命令

2023-09-07 23:30:47

運算符C++

2024-02-26 15:17:20

2009-06-21 13:48:05

ShellLinux運算符
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩在线一区二区 | 国产成人啪免费观看软件 | 亚洲精品一二三区 | 久草院线 | 国产精品视频一二三区 | 超碰人人91 | 免费成人av网站 | 永久免费av | 亚洲日本乱码在线观看 | 中文字幕亚洲精品 | 中文字幕日韩欧美一区二区三区 | 在线亚洲免费视频 | 91视频电影| 波多野结衣二区 | 一级毛片免费视频观看 | 欧美精品一区二区三区四区 | 国产乱码精品一区二区三区中文 | 无码一区二区三区视频 | 亚洲一区二区在线播放 | 一区二区在线 | 成人av观看 | 欧美一区二区三区视频在线 | 日本成人在线观看网站 | 99精品欧美一区二区三区综合在线 | 欧美色综合一区二区三区 | av在线一区二区 | 麻豆精品国产免费 | 日韩欧美中文字幕在线视频 | 中文字幕一区二区三区在线观看 | 午夜视频免费网站 | 日日草夜夜草 | 天堂av中文在线 | av高清| 欧美一a | 国产高清免费 | 日本亚洲精品 | 国产精品久久精品 | 亚洲色欧美另类 | 中文字字幕在线中文乱码范文 | 久热爱| 亚洲免费视频在线观看 |