溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

發(fā)布時(shí)間:2020-06-03 07:55:15 來(lái)源:網(wǎng)絡(luò) 閱讀:581 作者:胡壯壯 欄目:移動(dòng)開(kāi)發(fā)

在去年翻譯《Swift編程入門(mén)經(jīng)典》(Swift1.0版本,基于Xcode6)這本書(shū)時(shí),系統(tǒng)的搞了搞Swift語(yǔ)言,接下來(lái)的一段時(shí)間內(nèi)打算持續(xù)更新一下相關(guān)Swift語(yǔ)言的一些東西, 不過(guò)現(xiàn)在已經(jīng)是Swift2.0版本了,區(qū)別還是不小的。并且目前在工作中正重構(gòu)著整個(gè)項(xiàng)目的代碼,之后根據(jù)一些項(xiàng)目實(shí)例再更新一些關(guān)于代碼重構(gòu)的博客與大家交流一下,然后再整理一些Android開(kāi)發(fā)的一些東西吧,當(dāng)然是類(lèi)比著iOS開(kāi)發(fā)了。

  廢話少說(shuō),開(kāi)始今天博客的主題。有些小伙伴看到今天的博客Title可能會(huì)笑到,基本運(yùn)算符有什么好說(shuō)的,只要會(huì)編程的,都會(huì)使用基本運(yùn)算符。此話不假,但是今天博客的主題不是介紹++i還有i++的區(qū)別的。今天博客中介紹那些在Swift中比較獨(dú)特的基本運(yùn)算符,這些運(yùn)算符會(huì)讓你眼前一亮(有些是在OC語(yǔ)法中渴望使用到的)。不積跬步無(wú)以至千里,不積小流無(wú)以成江海。雖然需要進(jìn)階,但是基礎(chǔ)還是蠻重要。今天博客前半部分是需要注意的基礎(chǔ)運(yùn)算符,有基礎(chǔ)運(yùn)算符當(dāng)然就有高級(jí)運(yùn)算符,接著會(huì)介紹一些高級(jí)運(yùn)算符。今天就窺探一下Swift2.0的東西(基于Xcode7.1)

一. 需注意的基礎(chǔ)運(yùn)算符

  1. 賦值運(yùn)算符(=)

    在Objective-C,C等一些語(yǔ)言中允許你在表達(dá)式中使用=號(hào), 如下所示。 testNumber = 20會(huì)返回一個(gè)bool類(lèi)型的值YES。 testNumber = 20在表達(dá)式中是永真的。所以下方的代碼會(huì)打印Log中的內(nèi)容。

1     NSInteger testNumber = 10;2     if ((testNumber = 20)) {3         NSLog(@"testNumber = %ld", testNumber);4     }

    在Swift中是不允許這樣做的,從這一點(diǎn)也能看出Swift語(yǔ)言的安全性。如果你在Swift寫(xiě)了上面的代碼,就會(huì)報(bào)出下面的錯(cuò)誤。IDE就會(huì)提示你,問(wèn)你是不是應(yīng)該使用==預(yù)算符。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

  2.類(lèi)型安全性,不允許隱式類(lèi)型轉(zhuǎn)換

    這一點(diǎn)也是Swift語(yǔ)言的一個(gè)優(yōu)勢(shì),在Swift語(yǔ)言中是不允許你使用隱式類(lèi)型轉(zhuǎn)換的。即便是Double類(lèi)型和Float類(lèi)型進(jìn)行隱式類(lèi)型轉(zhuǎn)換也是不可以的。而在Objective-C中是可以進(jìn)行隱式類(lèi)型轉(zhuǎn)換的??聪路綄?shí)例:

    在Objective-C中你可以這樣做, 下方代碼是可以編譯通過(guò)的。兩種類(lèi)型(Float32, Float64)不同的數(shù)據(jù)進(jìn)行相加,然后再把結(jié)果隱式轉(zhuǎn)換成另一種類(lèi)型(NSInteger)。

1     Float32 floatNumber1 = 10.0f;2     Float64 floatNumber2 = 20.0f;3     NSInteger result = floatNumber1 + floatNumber2;

    上面的代碼在Swift中如下,IDE會(huì)報(bào)一個(gè)錯(cuò)誤,如下所示。錯(cuò)誤的大致意思就是你不能把Float32類(lèi)型的數(shù)據(jù)與Float64類(lèi)型的數(shù)據(jù)進(jìn)行相加。其本質(zhì)原因是在Swift語(yǔ)言中是不允許你進(jìn)行隱式類(lèi)型

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    在Swift中對(duì)上述代碼進(jìn)行類(lèi)型顯示轉(zhuǎn)換,編譯就會(huì)通過(guò)。在Playground中就會(huì)顯示相應(yīng)的結(jié)果值。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

  3.取模運(yùn)算(%)的特殊性

    還是以O(shè)bjective-C做類(lèi)比,在Objective-C中取模運(yùn)算(%)只支持整型,如果在取模運(yùn)算中你使用了浮點(diǎn)類(lèi)型,那么就會(huì)報(bào)出如下錯(cuò)誤。大概意思就是取模運(yùn)算不支持浮點(diǎn)類(lèi)型,請(qǐng)轉(zhuǎn)換成NSInteger類(lèi)型。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    而Swift中的取模運(yùn)算就支持浮點(diǎn)類(lèi)型,上面的語(yǔ)句在Swift中就不會(huì)報(bào)錯(cuò),下方是上述事例在Playground中的結(jié)果值:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

  4. nil聚合(合并,連接)運(yùn)算符(??)

    該運(yùn)算符可謂是Swift中添加的新特性,??運(yùn)算符在Objective-C中是沒(méi)有的。但是??不是Swift的原創(chuàng),在C#中也是有??運(yùn)算符的,而且用法和Swift中??用法類(lèi)似。都是用來(lái)處理nil值的運(yùn)算符,通過(guò)一個(gè)實(shí)例來(lái)進(jìn)行介紹,一目了然。

    在實(shí)例中我們先定義一個(gè)可選類(lèi)型的字符串變量developLanguage,來(lái)記錄開(kāi)發(fā)語(yǔ)言, 再定義一個(gè)選擇開(kāi)發(fā)語(yǔ)言的字符串變量selectLanguage。如果developLanguage的值為nil的話,默認(rèn)選擇的語(yǔ)言是“Swift”。 如果developLanguage的值不為nil, 就強(qiáng)制打開(kāi)可選類(lèi)型的值,把該值賦值給字符串變量selectLanguage。具體代碼如下所示:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

    接下來(lái)就是預(yù)算符??出廠的時(shí)候了,一個(gè)??的功能就是上面代碼中if -- else的功能。也就是說(shuō)上面的if -- else 語(yǔ)句可以使用下方的??運(yùn)算符來(lái)代替。下面要注意一點(diǎn)的是在??運(yùn)算符中使用可選類(lèi)型變量時(shí)沒(méi)有使用!強(qiáng)制打開(kāi)可選類(lèi)型的值, 因?yàn)樵??運(yùn)算符中能確保使用的可選類(lèi)型變量中有值,如果沒(méi)有值就不打開(kāi)使用,所以就可以把!省略掉。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

  5.比較運(yùn)算符支持字符串

    在Objective-C中你可以使用比較運(yùn)算符來(lái)比較運(yùn)算符,這樣做編譯器是不會(huì)報(bào)錯(cuò)的,但是你不會(huì)得到你想要的結(jié)果。如果你直接用比較運(yùn)算符來(lái)比較字符串的話實(shí)質(zhì)上是比較的字符串的內(nèi)存地址,請(qǐng)看下方Objective-C的代碼。有下方的輸出結(jié)果不難看出比較的是字符串的內(nèi)存地址。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    在Swift中你可以使用比較運(yùn)算符來(lái)比較字符串,如下所示:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

  6.區(qū)間運(yùn)算符

    區(qū)間運(yùn)算符可以表示兩個(gè)值之間的范圍。... 是閉區(qū)間運(yùn)算符,比如a...b表示a到b這個(gè)區(qū)間并且包括a和b的值。 ..<是半開(kāi)區(qū)間, 比如a..<b 表示a到b這個(gè)區(qū)間的值,不包括b。其用法如下:

    下方代碼使用的是閉區(qū)間運(yùn)算符1...10, 會(huì)循環(huán)10次

       Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    如果改成半開(kāi)區(qū)間,那么就是循環(huán)9次

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

二. Swift中的高級(jí)運(yùn)算符

  1.Swift中的位運(yùn)算

    如果你在大學(xué)課程中學(xué)過(guò)數(shù)字電路這門(mén)課程的話,想必不會(huì)對(duì)位運(yùn)算陌生的。在好多編程語(yǔ)言中也都有位運(yùn)算。位運(yùn)算應(yīng)用得當(dāng)可以提高算法的效率,在一些高效的算法中有時(shí)會(huì)用到位運(yùn)算,再此就不做過(guò)多的討論了。接下來(lái)將會(huì)搞一搞Swift中的按位與,按位或,按位異或以及按位取反等操作。

    (1) 按位與(&)

    對(duì)二進(jìn)制中的每一位進(jìn)行與操作,所以叫按位與。運(yùn)算規(guī)則為1 & 1 = 1,  1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0。按位與簡(jiǎn)單的用法就是保留二進(jìn)制中的指定位數(shù),或者對(duì)數(shù)值進(jìn)行清零操作。下方是按位與操作的小實(shí)例:0000_1111與1000_1011進(jìn)行按位與運(yùn)算,就是保留1000_1011的后四位。如果要對(duì)指定的二進(jìn)制數(shù)進(jìn)行清零的話,只需要把該值和0000_0000進(jìn)行按位與操作即可。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    下方是上述代碼中按位與的原理圖:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

    (2)按位或(|)

    顧名思義,按位或就是對(duì)二進(jìn)制中的每一位進(jìn)行或操作,所以叫按位或。運(yùn)算規(guī)則為 1 | 1 = 1, 1 | 0 = 1,  0 | 1 = 1, 0 | 0 = 0。按位或常用來(lái)把指定位置的數(shù)值置為1。下方是實(shí)例是要把0000_0011的前四位置為1,后四位不變,所以要與1111_0000進(jìn)行按位或操作。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    按位或操作的原理圖如下:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

    (3) 按位異或(^)

    異或的運(yùn)算法則也是比較容易理解的, 簡(jiǎn)單一句話就是相同為0,不同為1。 1 ^ 1 = 0,  1 ^ 0 = 1,  0 ^ 1 = 1,  0 ^ 0 = 0。有異或的運(yùn)算規(guī)則我們?nèi)菀椎贸? 異或任何一個(gè)數(shù),還等于這個(gè)數(shù)的本身。1 異或任何一個(gè)數(shù)等于這個(gè)數(shù)取反。下方是一個(gè)實(shí)例:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    上面代碼的原理圖如下:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    異或的用法是比較多的,我們可以使用異或運(yùn)算在不創(chuàng)建臨時(shí)變量時(shí)來(lái)交換兩個(gè)數(shù)的值。具體如下:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    我們還可以使用異或運(yùn)算來(lái)判斷兩個(gè)值是否相等,如果兩個(gè)數(shù)異或后的值為0,那么兩個(gè)數(shù)就相等,具體代碼如下所示:

1 if swap1 ^ swap2 == 0 {2     print("swap1 == swap2")3 }

 

    (4) 按位取反(~)

      一個(gè)數(shù)值與1進(jìn)行異或,都會(huì)得到其相反的值,也就是取反。我們還可以通過(guò)按位取反運(yùn)算符來(lái)對(duì)值進(jìn)行取反,取反的規(guī)則就比較簡(jiǎn)單了,就是0變成1,1變成0。下方是取反運(yùn)算的實(shí)例,在Playground中可以看出其取反后的值。按位取反的實(shí)例如下(下面只討論的正數(shù)的取反,關(guān)于負(fù)數(shù)的取反沒(méi)有):

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

    (5) 按位左移(<<)和按位右移(>>)操作

      正數(shù)的左右位移用0來(lái)填補(bǔ)空位,而負(fù)數(shù)左移用0來(lái)填補(bǔ),右移用符號(hào)位來(lái)填補(bǔ)。實(shí)例如下:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

 

  2.溢出運(yùn)算符

    在Swift語(yǔ)言中,如果值溢出,是會(huì)報(bào)錯(cuò)的。這也能反映出Swift安全性,如果你想在值溢出時(shí)對(duì)有效位進(jìn)行截?cái)嗟脑?,那么你就可以使用溢出運(yùn)算符。

    值上溢出運(yùn)算符(&+), 關(guān)于值上溢運(yùn)算符,就不說(shuō)多少?gòu)U話了,直接上實(shí)例。在Playground中取出UInt8類(lèi)型的上限,然后對(duì)其加1,讓其溢出。如果你直接使用+號(hào)的話,會(huì)給出一個(gè)錯(cuò)誤。使用&+就不一樣了,效果如下。值的下溢運(yùn)算符(&-, &*)的用法和&+類(lèi)似,在此就不做贅述了。(&/與&%)在Xcode7中未編譯通過(guò),提示找不到此標(biāo)示符。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 

 

 

  3. 運(yùn)算符重載

    在Swift2.0中運(yùn)算符重載是比較容易實(shí)現(xiàn)的,就是把函數(shù)名換成你要重載的運(yùn)算符即可。下方就通過(guò)一個(gè)小實(shí)例來(lái)看一下Swift中的運(yùn)算符重載。在Swift中是+號(hào)運(yùn)算符是不支持元組直接相加的,如果你直接對(duì)元組進(jìn)行加法操作,會(huì)報(bào)下面的錯(cuò)誤。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

   ?。?)對(duì)中綴運(yùn)算符重載,如果對(duì)+運(yùn)算符進(jìn)行重載,那么+運(yùn)算符將會(huì)支持元組相加, 具體代碼和運(yùn)行結(jié)果如下所示,+運(yùn)算符原來(lái)的功能還是不變的。

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    (2)對(duì)前綴運(yùn)算符進(jìn)行重載,就以-運(yùn)算符為例。對(duì)前綴運(yùn)算符重載在func前面要加上prefix修飾符。如果要對(duì)后綴運(yùn)算符進(jìn)行重載的話,要使用postfix進(jìn)行修飾,下方是對(duì)-進(jìn)行前綴運(yùn)算符重載。具體代碼如下:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

 1 //前綴運(yùn)算符重載 2 struct Point { 3     var x = 0.0, y = 0.0 4 } 5  6 prefix func - (point: Point) -> Point { 7     return Point(x: -point.x, y: -point.y) 8 } 9 let positive = Point(x: 3.0, y: 4.0)10 let negative = -positive

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    結(jié)果輸出如下:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

    (3) 自定義運(yùn)算符:在Swift中支持定義屬于你自己的運(yùn)算符,在定義運(yùn)算符時(shí),先使用operator 聲明一下所指定的標(biāo)示符,并且指定一下是前綴還是后綴等,具體的就看下面的代碼即可:

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

//自定義運(yùn)算符//1、先聲明自定義的運(yùn)算符prefix operator +++ {}//2.進(jìn)行實(shí)現(xiàn)prefix func +++ (point:Point) -> Point{    return Point(x:point.x + 1, y:point.y + 1);
}

let aaa = Point(x: 1.0, y:2.0);
let add = +++aaa;
print(add)     // Point(x: 2.0, y: 3.0)

 Swift之需要注意的基本運(yùn)算符和高級(jí)運(yùn)算符

   


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI