Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)自2013年起,先為船營等服務(wù)建站,船營等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為船營企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(1) 按位與(&)

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

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

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

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

(2)按位或(|)

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

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

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

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

(3) 按位異或(^)

異或的運(yù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)算符和高級運(yùn)算符

上面代碼的原理圖如下:

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

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

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

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

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

(4) 按位取反(~)

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

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

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

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

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

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

在Swift語言中,如果值溢出,是會報(bào)錯(cuò)的。這也能反映出Swift安全性,如果你想在值溢出時(shí)對有效位進(jìn)行截?cái)嗟脑挘敲茨憔涂梢允褂靡绯鲞\(yùn)算符。

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

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

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

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

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

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

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

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

 Swift之需要注意的基本運(yùn)算符和高級運(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)算符和高級運(yùn)算符

結(jié)果輸出如下:

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

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

 Swift之需要注意的基本運(yùn)算符和高級運(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)算符和高級運(yùn)算符

 

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享名稱:Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符-創(chuàng)新互聯(lián)
當(dāng)前URL:http://bm7419.com/article30/cdghpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、微信小程序網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站建設(shè)品牌網(wǎng)站制作、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作