二 Swift學習之基本運算子

2021-06-28 22:43:10 字數 4298 閱讀 4197

二 swift學習之基本運算子

————– 借鑑老碼團隊翻譯組-tyrion

1.1術語

運算子有一元、二元和三元運算子。

一元運算子對單一操作物件操作(如-a)。一元運算子分前置運算子和後置運算子,前置運算子需緊排操作物件之前(如!b),後置運算子需緊跟操作物件之後(如i++)。

二元運算子操作兩個操作物件(如2 + 3),是中置的,因為它們出現在兩個操作物件之間。

三元運算子操作三個操作物件,和 c 語言一樣,swift 只有乙個三元運算子,就是三目運算子(a ? b : c)。

受運算子影響的值叫運算元,在表示式1 + 2中,加號+是二元運算子,它的兩個運算元是值1和2。

1.2 賦值運算子

賦值運算(a = b),表示用b的值來初始化或更新a的值:

let b = 10

var a = 5

a = b // a 現在等於 10

如果賦值的右邊是乙個多元組,它的元素可以馬上被分解多個變數或變數:

let (x, y) = (1, 2) // 現在 x 等於 1, y 等於 2

與 c 語言和 objective-c 不同,swift 的賦值操作並不返回任何值。所以以下**是錯誤的:

if x = y

這個特性使得你無法把(==)錯寫成(=)了,由於if x = y是錯誤**,swift 從底層幫你避免了這些**錯誤。

1.3 算數運算子

加法(+) 減法(-) 乘法(*) 除法(/)

1.4 求餘運算子

求餘運算(%)在其他語言也叫取模運算。然而嚴格說來,我們看該運算子對負數的操作結果,」求餘」比」取模」更合適些。

在 swift 中可以表達為:

a % b

9 % 4 // 等於 1

-9 % 4 // 等於-1

9 % -4 // 等於 1

-9 % -4 // 等於-1

餘數的符號取決於a的符號,a若負,餘數就為負數;反之為正

1.5 浮點數求餘計算

不同於 c 語言和 objective-c,swift 中是可以對浮點數進行求餘的。

8 % 2.5 // 等於 0.5

這個例子中,8除於2.5等於3餘0.5,所以結果是乙個double值0.5。

1.6 自增自減運算

++i 先自増再返回

i++ 先返回再自增

例如:

var a = 0

let b = ++a // ++a 相當於 a = a + 1 a 和 b 現在都是 1

let c = a++ // a 現在 2, 但 c 是 a 自增前的值 1

上述例子,let b = ++a先把a加1了再返回a的值。所以a和b都是新值1。

而let c = a++,是先返回了a的值,然後a才加1。所以c得到了a的舊值1,而a加1後變成2。

除非你需要使用i++的特性,不然推薦你使用++i和–i,因為先修改後返回這樣的行為更符合我們的邏輯。

1.7 一元負號運算子和一元正號運算子

數值的正負號可以使用字首-(即一元負號)來切換,中間沒有空格:

let three = 3

let minusthree = -three // minusthree 等於 -3

let plusthree = -minusthree // plusthree 等於 3, 或 「負負3」

一元正號(+)不做任何改變地返回運算元的值。

let minussix = -6

let alsominussix = +minussix // alsominussix 等於 -6

雖然一元+什麼都不會改變,但當你在使用一元負號來表達負數時,你可以使用一元正號來表達正數,如此你的**會具有對稱美。

1.8 復合賦值(compound assignment operators)

如同強大的 c 語言,swift 也提供把其他運算子和賦值運算(=)組合的復合賦值運算子,組合加運算(+=)是其中乙個例子:

var a = 1

a += 2 // a 現在是 3 a += 2是a = a + 2的簡寫

注意:復合賦值運算沒有返回值,let b = a += 2這類**是錯誤。這不同於上面提到的自增和自減運算子。

1.9 比較運算子

所有標準 c 語言中的比較運算都可以在 swift 中使用。

等於(a == b) 1 == 1 // true, 因為 1 等於 1

不等於(a != b) 2 != 1 // true, 因為 2 不等於 1

大於(a > b) 2 > 1 // true, 因為 2 大於 1

小於(a < b) 1 < 2 // true, 因為 1 小於2

大於等於(a >= b) 1 >= 1 // true, 因為 1 大於等於 1

小於等於(a <= b) 2 <= 1 // false, 因為 2 並不小於等於 1

注意: swift 也提供恒等===和不恒等!==這兩個比較符來判斷兩個物件是否引用同乙個物件例項。

比較運算多用於條件語句,如if條件:

let name = 「world」

if name == 「world」 else

// 輸出 「hello, world」, 因為name就是等於 「world」

1.10 三目運算子(ternary conditional operator)

三目運算子的特殊在於它是有三個運算元的運算子,縮寫形式: 條件 ? 成立 : 不成立。它簡潔地表達根據問題成立與否作出二選一的操作。如果條件成立,返回成立; 如果不成立,返回不成立。

1.11 空合運算子(nil coalescing operator)

空合運算子(a ?? b)將對可選型別a進行空判斷,如果a包含乙個值就進行解封,否則就返回乙個預設值b.這個運算子有兩個條件:

1)表示式a必須是optional型別

2)預設值b的型別必須要和a儲存值的型別保持一致

空合併運算子是對以下**的簡短表達方法

a != nil ? a! : b

上述**使用了三目運算子。當可選型別a的值不為空時,進行強制解封(a!)訪問a中值,反之當a中值為空時,返回預設值b。無疑空合運算子(??)提供了一種更為優雅的方式去封裝條件判斷和解封兩種行為,顯得簡潔以及更具可讀性。

注意: 如果a為非空值(non-nil),那麼值b將不會被估值。這也就是所謂的短路求值。

下文例子採用空合併運算子,實現了在預設顏色名和可選自定義顏色名之間抉擇:

let defaultcolorname = 「red」

var userdefinedcolorname:string? //預設值為nil

var colornametouse = userdefinedcolorname ?? defaultcolorname

//userdefinedcolorname的值為空 ,所以colornametouse的值為red

userdefinedcolorname變數被定義為乙個可選字串型別,預設值為nil。由於userdefinedcolorname是乙個可選型別,我們可以使用空合運算子去判斷其值。在上乙個例子中,通過空合運算子為乙個名為colornametouse的變數賦予乙個字串型別初始值。 由於userdefinedcolorname值為空,因此表示式userdefinedcolorname ?? defaultcolorname返回預設值,即red。

另一種情況,分配乙個非空值(non-nil)給 userdefinedcolorname,再次執行空合運算,運算結果為封包在userdefaultcolorname中的值,而非預設值。

userdefinedcolorname = 「green」

colornametouse = userdefinedcolorname ?? defaultcolorname

//userdefinedcolorname非空,因此colornametousede的值為綠色

1.12 區間運算子

swift 提供了兩個方便表達乙個區間的值的運算子。

1)閉區間運算子(a…b)定義乙個包含從a到b(包括a和b)的所有值的區間,b必須大於a。 ‌ 閉區間運算子在迭代乙個區間的所有值時是非常有用的,如在for-in迴圈中:

for index in 1…5

// 1 * 5 = 5

// 2 * 5 = 10

// 3 * 5 = 15

// 4 * 5 = 20

// 5 * 5 = 25

2)半開區間運算子

半開區間(a..

Swift 基本運算子之數值運算

運算子是檢查,改變,合併值的特殊符號或短語.例如,加號 把計算兩個數的和 如 let i 1 2 複雜些的執行算包括邏輯與 如 if entereddoorcode passedretinascan 還有自增運算子 i 這樣讓自身加一的便捷運算。下面介紹基礎運算子中的數值運算。swift 讓所有數值...

Swift 教程(二) 基本運算子

swift 支援 c 中的大多數標準運算子,有過 c 語言基礎或者其他語言基礎的都不陌生,在這就不做過多的闡述了。現在說點不一樣的東西,swift 提供了兩張 c 中沒有的區間運算子 a 區間運算子 swift 包含了兩個區間運算子,他們是表示乙個範圍的值的便捷方式。閉區間運算子 a b 定義了從 ...

Swift 基本運算子

1,zebra 2 true,因為 1 小於 2 3 3 bird 4,dog 4,dog true,因為 4 等於 4,dog 等於 dog blue 1 purple 1 true blue false purple true 錯誤,因為 不能比較布林型別注意 1.bool 不能被比較,也意味著...