天天看點

Swift數字類型之間的轉換

Swift數字類型之間的轉換Swift是一種安全的語言,對于類型的檢查非常嚴格,不同類型之間不能随便轉換。

一、整型之間的轉換

在C和Objective-C等其他語言中,整型之間有兩種轉換方法:

從小範圍數到大範圍數轉換是自動的;

從大範圍數到小範圍數需要強制類型轉換,有可能造成資料精度的丢失。

而在Swift中這兩種方法是行不通的,我們需要通過一些函數進行顯式地轉換,代碼如下:

let historyScore:UInt8 = 90


let englishScore:UInt16 = 130


let totalScore = historyScore + englishScore  //錯誤	①


let totalScore = UInt16(historyScore) + englishScore   //正确	②


let totalScore = historyScore + UInt8(englishScore)  //正确	③           

上述代碼聲明和初始化了兩個常量historyScore和englishScore,我們把它們相加指派給totalScore。如果采用第①行代碼實作相加,程式就會有編譯錯誤,原因是historyScore是UInt8類型,而englishScore是UInt16類型,它們之間不能轉換。

我們有兩種轉換方法。

一種是把UInt8的historyScore轉換為UInt16類型。由于是從小範圍數轉換為大範圍數,這種轉換是安全的。代碼第②行UInt16(historyScore)就是正确的轉換方法。

另外一種是把UInt16的englishScore轉換為UInt8類型。由于是從大範圍數轉換為小範圍數,這種轉換是不安全的,如果轉換的數比較大會造成精度的丢失。代碼第③行UInt8(englishScore)是正确的轉換方法。由于本例中englishScore的值是130,這個轉換是成功的,如果把這個數修改為1300,雖然程式編譯沒有問題,但是會在控制台中輸出異常資訊,這是運作期異常。

上述代碼中,UInt16(historyScore)和UInt8(englishScore)事實上是構造器,能夠建立并初始化另外一個類型。關于構造器的内容,我們會在第14章詳細介紹。

二、整型與浮點型之間的轉換

整型與浮點型之間的轉換與整型之間的轉換類似,是以我們将上一節的示例修改如下:

let historyScore:Float = 90.6        	①


let englishScore:UInt16 = 130        	②


let totalScore = historyScore + englishScore  //錯誤        	③


let totalScore = historyScore + Float(englishScore)  //正确,安全   	④


let totalScore = UInt16(historyScore) + englishScore  //正确,小數被截掉	⑤           

上述代碼經過了一些修改,第①行代碼historyScore變量類型是Float類型。第②行代碼englishScore變量還是UInt16類型。其中第③行代碼直接進行了計算,結果有編譯錯誤。第④行代碼是将UInt16類型的englishScore變量轉換為Float類型,這種轉換是最安全的。第⑤行代碼是将Float類型的historyScore變量轉換為UInt16類型,這種轉換首先會導緻小數被截掉,另外如果historyScore變量數很大,會導緻運作期異常,這與整型之間的轉換是類似的。

更多内容請關注國内第一本Swift圖書 《Swift開發指南》 本書交流讨論網站: http://www.51work6.com/swift.php 歡迎加入Swift技術讨論群:362298485

歡迎關注智捷iOS課堂微信公共平台

Swift數字類型之間的轉換