您好,登錄后才能下訂單哦!
在去年翻譯《Swift編程入門經典》(Swift1.0版本,基于Xcode6)這本書時,系統的搞了搞Swift語言,接下來的一段時間內打算持續更新一下相關Swift語言的一些東西, 不過現在已經是Swift2.0版本了,區別還是不小的。并且目前在工作中正重構著整個項目的代碼,之后根據一些項目實例再更新一些關于代碼重構的博客與大家交流一下,然后再整理一些Android開發的一些東西吧,當然是類比著iOS開發了。
廢話少說,開始今天博客的主題。有些小伙伴看到今天的博客Title可能會笑到,基本運算符有什么好說的,只要會編程的,都會使用基本運算符。此話不假,但是今天博客的主題不是介紹++i還有i++的區別的。今天博客中介紹那些在Swift中比較獨特的基本運算符,這些運算符會讓你眼前一亮(有些是在OC語法中渴望使用到的)。不積跬步無以至千里,不積小流無以成江海。雖然需要進階,但是基礎還是蠻重要。今天博客前半部分是需要注意的基礎運算符,有基礎運算符當然就有高級運算符,接著會介紹一些高級運算符。今天就窺探一下Swift2.0的東西(基于Xcode7.1)
一. 需注意的基礎運算符
1. 賦值運算符(=)
在Objective-C,C等一些語言中允許你在表達式中使用=號, 如下所示。 testNumber = 20會返回一個bool類型的值YES。 testNumber = 20在表達式中是永真的。所以下方的代碼會打印Log中的內容。
1 NSInteger testNumber = 10;2 if ((testNumber = 20)) {3 NSLog(@"testNumber = %ld", testNumber);4 }
在Swift中是不允許這樣做的,從這一點也能看出Swift語言的安全性。如果你在Swift寫了上面的代碼,就會報出下面的錯誤。IDE就會提示你,問你是不是應該使用==預算符。
2.類型安全性,不允許隱式類型轉換
這一點也是Swift語言的一個優勢,在Swift語言中是不允許你使用隱式類型轉換的。即便是Double類型和Float類型進行隱式類型轉換也是不可以的。而在Objective-C中是可以進行隱式類型轉換的。看下方實例:
在Objective-C中你可以這樣做, 下方代碼是可以編譯通過的。兩種類型(Float32, Float64)不同的數據進行相加,然后再把結果隱式轉換成另一種類型(NSInteger)。
1 Float32 floatNumber1 = 10.0f;2 Float64 floatNumber2 = 20.0f;3 NSInteger result = floatNumber1 + floatNumber2;
上面的代碼在Swift中如下,IDE會報一個錯誤,如下所示。錯誤的大致意思就是你不能把Float32類型的數據與Float64類型的數據進行相加。其本質原因是在Swift語言中是不允許你進行隱式類型
在Swift中對上述代碼進行類型顯示轉換,編譯就會通過。在Playground中就會顯示相應的結果值。
3.取模運算(%)的特殊性
還是以Objective-C做類比,在Objective-C中取模運算(%)只支持整型,如果在取模運算中你使用了浮點類型,那么就會報出如下錯誤。大概意思就是取模運算不支持浮點類型,請轉換成NSInteger類型。
而Swift中的取模運算就支持浮點類型,上面的語句在Swift中就不會報錯,下方是上述事例在Playground中的結果值:
4. nil聚合(合并,連接)運算符(??)
該運算符可謂是Swift中添加的新特性,??運算符在Objective-C中是沒有的。但是??不是Swift的原創,在C#中也是有??運算符的,而且用法和Swift中??用法類似。都是用來處理nil值的運算符,通過一個實例來進行介紹,一目了然。
在實例中我們先定義一個可選類型的字符串變量developLanguage,來記錄開發語言, 再定義一個選擇開發語言的字符串變量selectLanguage。如果developLanguage的值為nil的話,默認選擇的語言是“Swift”。 如果developLanguage的值不為nil, 就強制打開可選類型的值,把該值賦值給字符串變量selectLanguage。具體代碼如下所示:
接下來就是預算符??出廠的時候了,一個??的功能就是上面代碼中if -- else的功能。也就是說上面的if -- else 語句可以使用下方的??運算符來代替。下面要注意一點的是在??運算符中使用可選類型變量時沒有使用!強制打開可選類型的值, 因為在??運算符中能確保使用的可選類型變量中有值,如果沒有值就不打開使用,所以就可以把!省略掉。
5.比較運算符支持字符串
在Objective-C中你可以使用比較運算符來比較運算符,這樣做編譯器是不會報錯的,但是你不會得到你想要的結果。如果你直接用比較運算符來比較字符串的話實質上是比較的字符串的內存地址,請看下方Objective-C的代碼。有下方的輸出結果不難看出比較的是字符串的內存地址。
在Swift中你可以使用比較運算符來比較字符串,如下所示:
6.區間運算符
區間運算符可以表示兩個值之間的范圍。... 是閉區間運算符,比如a...b表示a到b這個區間并且包括a和b的值。 ..<是半開區間, 比如a..<b 表示a到b這個區間的值,不包括b。其用法如下:
下方代碼使用的是閉區間運算符1...10, 會循環10次
如果改成半開區間,那么就是循環9次
二. Swift中的高級運算符
1.Swift中的位運算
如果你在大學課程中學過數字電路這門課程的話,想必不會對位運算陌生的。在好多編程語言中也都有位運算。位運算應用得當可以提高算法的效率,在一些高效的算法中有時會用到位運算,再此就不做過多的討論了。接下來將會搞一搞Swift中的按位與,按位或,按位異或以及按位取反等操作。
(1) 按位與(&)
對二進制中的每一位進行與操作,所以叫按位與。運算規則為1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 = 0。按位與簡單的用法就是保留二進制中的指定位數,或者對數值進行清零操作。下方是按位與操作的小實例:0000_1111與1000_1011進行按位與運算,就是保留1000_1011的后四位。如果要對指定的二進制數進行清零的話,只需要把該值和0000_0000進行按位與操作即可。
下方是上述代碼中按位與的原理圖:
(2)按位或(|)
顧名思義,按位或就是對二進制中的每一位進行或操作,所以叫按位或。運算規則為 1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0。按位或常用來把指定位置的數值置為1。下方是實例是要把0000_0011的前四位置為1,后四位不變,所以要與1111_0000進行按位或操作。
按位或操作的原理圖如下:
(3) 按位異或(^)
異或的運算法則也是比較容易理解的, 簡單一句話就是相同為0,不同為1。 1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1, 0 ^ 0 = 0。有異或的運算規則我們容易得出0 異或任何一個數,還等于這個數的本身。1 異或任何一個數等于這個數取反。下方是一個實例:
上面代碼的原理圖如下:
異或的用法是比較多的,我們可以使用異或運算在不創建臨時變量時來交換兩個數的值。具體如下:
我們還可以使用異或運算來判斷兩個值是否相等,如果兩個數異或后的值為0,那么兩個數就相等,具體代碼如下所示:
1 if swap1 ^ swap2 == 0 {2 print("swap1 == swap2")3 }
(4) 按位取反(~)
一個數值與1進行異或,都會得到其相反的值,也就是取反。我們還可以通過按位取反運算符來對值進行取反,取反的規則就比較簡單了,就是0變成1,1變成0。下方是取反運算的實例,在Playground中可以看出其取反后的值。按位取反的實例如下(下面只討論的正數的取反,關于負數的取反沒有):
(5) 按位左移(<<)和按位右移(>>)操作
正數的左右位移用0來填補空位,而負數左移用0來填補,右移用符號位來填補。實例如下:
2.溢出運算符
在Swift語言中,如果值溢出,是會報錯的。這也能反映出Swift安全性,如果你想在值溢出時對有效位進行截斷的話,那么你就可以使用溢出運算符。
值上溢出運算符(&+), 關于值上溢運算符,就不說多少廢話了,直接上實例。在Playground中取出UInt8類型的上限,然后對其加1,讓其溢出。如果你直接使用+號的話,會給出一個錯誤。使用&+就不一樣了,效果如下。值的下溢運算符(&-, &*)的用法和&+類似,在此就不做贅述了。(&/與&%)在Xcode7中未編譯通過,提示找不到此標示符。
3. 運算符重載
在Swift2.0中運算符重載是比較容易實現的,就是把函數名換成你要重載的運算符即可。下方就通過一個小實例來看一下Swift中的運算符重載。在Swift中是+號運算符是不支持元組直接相加的,如果你直接對元組進行加法操作,會報下面的錯誤。
(1)對中綴運算符重載,如果對+運算符進行重載,那么+運算符將會支持元組相加, 具體代碼和運行結果如下所示,+運算符原來的功能還是不變的。
(2)對前綴運算符進行重載,就以-運算符為例。對前綴運算符重載在func前面要加上prefix修飾符。如果要對后綴運算符進行重載的話,要使用postfix進行修飾,下方是對-進行前綴運算符重載。具體代碼如下:
1 //前綴運算符重載 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
結果輸出如下:
(3) 自定義運算符:在Swift中支持定義屬于你自己的運算符,在定義運算符時,先使用operator 聲明一下所指定的標示符,并且指定一下是前綴還是后綴等,具體的就看下面的代碼即可:
//自定義運算符//1、先聲明自定義的運算符prefix operator +++ {}//2.進行實現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)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。