下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國學(xué)校家具行業(yè)發(fā)展現(xiàn)狀及前景規(guī)劃研究報告
- 2024-2030年中國嬰兒洗護(hù)用品市場運(yùn)行動態(tài)及前景趨勢預(yù)測報告
- 2024-2030年中國女性洗液行業(yè)市場營銷模式及發(fā)展前景預(yù)測報告
- 2024-2030年中國多型腔熱流道管坯模具境外融資報告
- 2024年標(biāo)準(zhǔn)簡易個人魚塘承包合同模板版B版
- 梅河口康美職業(yè)技術(shù)學(xué)院《高級語言程序?qū)嵺`》2023-2024學(xué)年第一學(xué)期期末試卷
- 茂名職業(yè)技術(shù)學(xué)院《語文教學(xué)設(shè)計與實(shí)施》2023-2024學(xué)年第一學(xué)期期末試卷
- 微專題定量測定型實(shí)驗(yàn)突破策略-2024高考化學(xué)一輪考點(diǎn)擊破
- 呂梁職業(yè)技術(shù)學(xué)院《生物學(xué)科專業(yè)導(dǎo)論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年某科技公司與某航空公司關(guān)于機(jī)載娛樂系統(tǒng)的合同
- 模具開發(fā)FMEA失效模式分析
- 聶榮臻將軍:中國人民解放軍的奠基人之一
- 材料化學(xué)專業(yè)大學(xué)生職業(yè)生涯規(guī)劃書
- 乳品加工工(中級)理論考試復(fù)習(xí)題庫(含答案)
- 《教材循環(huán)利用》課件
- 學(xué)生思想政治工作工作證明材料
- 2023水性環(huán)氧樹脂涂層鋼筋
- 湘少版六年級英語上冊《Unit 12 第二課時(Part CPart D)》課堂教學(xué)課件公開課
- 國開《Windows網(wǎng)絡(luò)操作系統(tǒng)管理》形考任務(wù)2-配置本地帳戶與活動目錄域服務(wù)實(shí)訓(xùn)
- 環(huán)保設(shè)施安全風(fēng)險評估報告
- 配位化學(xué)-本科生版智慧樹知到課后章節(jié)答案2023年下蘭州大學(xué)
評論
0/150
提交評論