【移動應(yīng)用開發(fā)技術(shù)】 Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符_第1頁
【移動應(yīng)用開發(fā)技術(shù)】 Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符_第2頁
【移動應(yīng)用開發(fā)技術(shù)】 Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符_第3頁
【移動應(yīng)用開發(fā)技術(shù)】 Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符_第4頁
【移動應(yīng)用開發(fā)技術(shù)】 Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】Swift之需要注意的基本運(yùn)算符和高級運(yùn)算符

在去年翻譯《Swift編程入門經(jīng)典》(Swift1.0版本,基于Xcode6)這本書時,系統(tǒng)的搞了搞Swift語言,接下來的一段時間內(nèi)打算持續(xù)更新一下相關(guān)Swift語言的一些東西,不過現(xiàn)在已經(jīng)是Swift2.0版本了,區(qū)別還是不小的。并且目前在工作中正重構(gòu)著整個項(xiàng)目的代碼,之后根據(jù)一些項(xiàng)目實(shí)例再更新一些關(guān)于代碼重構(gòu)的博客與大家交流一下,然后再整理一些Android開發(fā)的一些東西吧,當(dāng)然是類比著iOS開發(fā)了。廢話少說,開始今天博客的主題。有些小伙伴看到今天的博客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會返回一個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寫了上面的代碼,就會報出下面的錯誤。IDE就會提示你,問你是不是應(yīng)該使用==預(yù)算符。

2.類型安全性,不允許隱式類型轉(zhuǎn)換這一點(diǎn)也是Swift語言的一個優(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會報一個錯誤,如下所示。錯誤的大致意思就是你不能把Float32類型的數(shù)據(jù)與Float64類型的數(shù)據(jù)進(jìn)行相加。其本質(zhì)原因是在Swift語言中是不允許你進(jìn)行隱式類型在Swift中對上述代碼進(jìn)行類型顯示轉(zhuǎn)換,編譯就會通過。在Playground中就會顯示相應(yīng)的結(jié)果值。

3.取模運(yùn)算(%)的特殊性還是以O(shè)bjective-C做類比,在Objective-C中取模運(yùn)算(%)只支持整型,如果在取模運(yùn)算中你使用了浮點(diǎn)類型,那么就會報出如下錯誤。大概意思就是取模運(yùn)算不支持浮點(diǎn)類型,請轉(zhuǎn)換成NSInteger類型。而Swift中的取模運(yùn)算就支持浮點(diǎn)類型,上面的語句在Swift中就不會報錯,下方是上述事例在Playground中的結(jié)果值:

4.nil聚合(合并,連接)運(yùn)算符(??)該運(yùn)算符可謂是Swift中添加的新特性,??運(yùn)算符在Objective-C中是沒有的。但是??不是Swift的原創(chuàng),在C#中也是有??運(yùn)算符的,而且用法和Swift中??用法類似。都是用來處理nil值的運(yùn)算符,通過一個實(shí)例來進(jìn)行介紹,一目了然。在實(shí)例中我們先定義一個可選類型的字符串變量developLanguage,來記錄開發(fā)語言,再定義一個選擇開發(fā)語言的字符串變量selectLanguage。如果developLanguage的值為nil的話,默認(rèn)選擇的語言是“Swift”。如果developLanguage的值不為nil,就強(qiáng)制打開可選類型的值,把該值賦值給字符串變量selectLanguage。具體代碼如下所示:

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

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

6.區(qū)間運(yùn)算符區(qū)間運(yùn)算符可以表示兩個值之間的范圍。...是閉區(qū)間運(yùn)算符,比如a...b表示a到b這個區(qū)間并且包括a和b的值。..<是半開區(qū)間,比如a..<b表示a到b這個區(qū)間的值,不包括b。其用法如下:下方代碼使用的是閉區(qū)間運(yùn)算符1...10,會循環(huán)10次如果改成半開區(qū)間,那么就是循環(huán)9次

二.Swift中的高級運(yùn)算符1.Swift中的位運(yùn)算如果你在大學(xué)課程中學(xué)過數(shù)字電路這門課程的話,想必不會對位運(yùn)算陌生的。在好多編程語言中也都有位運(yùn)算。位運(yùn)算應(yīng)用得當(dāng)可以提高算法的效率,在一些高效的算法中有時會用到位運(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)行按位與操作即可。下方是上述代碼中按位與的原理圖:

(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)行按位或操作。按位或操作的原理圖如下:

(3)按位異或(^)異或的運(yùn)算法則也是比較容易理解的,簡單一句話就是相同為0,不同為1。1^1=0,

1^0=1,

0^1=1,

0^0=0。有異或的運(yùn)算規(guī)則我們?nèi)菀椎贸?異或任何一個數(shù),還等于這個數(shù)的本身。1異或任何一個數(shù)等于這個數(shù)取反。下方是一個實(shí)例:上面代碼的原理圖如下:異或的用法是比較多的,我們可以使用異或運(yùn)算在不創(chuàng)建臨時變量時來交換兩個數(shù)的值。具體如下:我們還可以使用異或運(yùn)算來判斷兩個值是否相等,如果兩個數(shù)異或后的值為0,那么兩個數(shù)就相等,具體代碼如下所示:1

if

swap1

^

swap2

==

0

{2

print("swap1

==

swap2")3

}

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

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

2.溢出運(yùn)算符在Swift語言中,如果值溢出,是會報錯的。這也能反映出Swift安全性,如果你想在值溢出時對有效位進(jìn)行截斷的話,那么你就可以使用溢出運(yùn)算符。值上溢出運(yùn)算符(&+),關(guān)于值上溢運(yùn)算符,就不說多少廢話了,直接上實(shí)例。在Playground中取出UInt8類型的上限,然后對其加1,讓其溢出。如果你直接使用+號的話,會給出一個錯誤。使用&+就不一樣了,效果如下。值的下溢運(yùn)算符(&-,&*)的用法和&+類似,在此就不做贅述了。(&/與&%)在Xcode7中未編譯通過,提示找不到此標(biāo)示符。

3.運(yùn)算符重載在Swift2.0中運(yùn)算符重載是比較容易實(shí)現(xiàn)的,就是把函數(shù)名換成你要重載的運(yùn)算符即可。下方就通過一個小實(shí)例來看一下Swift中的運(yùn)算符重載。在Swift中是+號運(yùn)算符是不支持元組直接相加的,如果你直接對元組進(jìn)行加法操作,會報下面的錯誤。(1)對中綴運(yùn)算符重載,如果對+運(yùn)算符進(jìn)行重載,那么+運(yùn)算符將會支持元組相加,具體代碼和運(yùn)行結(jié)果如下所示,+運(yùn)算符原來的功能還是不變的。(2)對前綴運(yùn)算符進(jìn)行重載,就以-運(yùn)算符為例。對前綴運(yùn)算符重載在func前面要加上prefix修飾符。如果要對后綴運(yùn)算符進(jìn)行重載的話,要使用postfix進(jìn)行修飾,下方是對-進(jì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結(jié)果輸出如下:(3)自定義運(yùn)算符:在Swift中支持定義屬于你自己的運(yùn)算符,在定義運(yùn)算符時,先使用operator聲明一下所指定的標(biāo)示符,并且指定一下是前綴還是后綴等,具體的就看下面的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論