iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
Mobile Development

雙平台APP小遊戲開發實作! Swift & Kotlin 攜手出擊~系列 第 6

[Day06] swift & kotlin 入門篇!(4) 基礎語法-轉型與合併使用

  • 分享至 

  • xImage
  •  

轉型與連結

在JS中, 所有的轉型與連結都是無感的
也因為太方便太無感 常常會跑出意外的結果
例如

console.log(+"1" + "1")  
// 輸出 "11"

console.log(+"1" + 1 )  
// 輸出 "2"

console.log("1" + 1 )  
// 輸出 "11"

console.log("1" + 1  + 1)  
// 輸出 "111"

console.log("1" + (1  + 1))  
// 輸出 "12"

這種彈性在撰寫的時候很方便也很快速
但在程式運作上相對是不穩定的

swift 與 kotlin 都是強行別語言
而swift在嚴謹度上高了一點

swift

let house = "這個房子 高度"
let height = 200
let level = 2.0

// print(house + height) // 編譯錯誤 字串與數字不能直接串接

print(house + String(height))// 數字轉型字串 後可作文字串接
// 輸出: 這個房子 高度200

print(house + String(level))// 數字轉型字串 可完整轉型過去 不會移除小數點
// 輸出: 這個房子 高度2.0

// print(house + String(height * level))// 編譯錯誤 Int 與 Double 不能直接計算
print(house + String( Double(height) * level ) )
// 輸出: 這個房子 高度400.0

print("這個房子 高度\(height)")// 或者利用字串插值也是個好方法
// 輸出: 這個房子 高度200

let numInt: Int = 1
let numDouble: Double = 1.9999 // Double 64bit
let numFloat: Float = 1.9999 // Float 32bit

//print(numInt*numFloat) // 編譯錯誤 不同型別的計算被禁止
//print(numInt+numDouble) // 編譯錯誤 不同型別的計算被禁止
print(numInt*Int(numDouble)) // 輸出: 1 , 因為轉型過程中 精確度丟失 numDouble =1
print(numInt*Int(numFloat)) // 輸出: 1 , 轉型過程中 精確度丟失 numFloat =1

print(Int(1.999)) // 輸出: 1 ,小數點後直接丟失
print(Int(1.9999999999999999)) //2  轉型Int Double 9到小數點後16位會變成2
print(Double(numFloat)) // 1.999899983406067 精確度丟失
print(Float(numDouble)) // 1.9999

swift禁止不同型別間的計算
而轉型過程中也會造成精確丟失
依照之前的開發習慣
會盡量避免轉型運算這件事情
一開始寫程式的時候 設計好型別是很重要的

kotlin

fun main() {
    val house = "這個房子 高度"
    val height = 200
    val level = 2.0
	println(house + height) // 這個房子 高度200 同JAVA  當字串處理
    
    println(house + level.toString())// 數字轉型字串 可完整轉型過去 不會移除小數點
	// 這個房子 高度2.0
	 
	println(house + height * level)//  Int 與 Double 可以直接計算
	// 這個房子 高度400.0

    println("這個房子 ${height}")// 或者利用字串插值也是個好方法
	// 這個房子 高度200
    
    val numInt: Int = 1
    val numDouble: Double = 1.9999 // Double 64bit
    val numFloat: Float = 1.9999F // Float 32bit
    
    println(numInt*numFloat) // 1.9999 可正確計算 雖然沒看到F, 但實際上是Float
    println((numInt*numFloat).javaClass.kotlin.simpleName ) // 輸出: Float
    
	println(numInt+numDouble) // 2.9999000000000002 轉型計算後會產生偏差
    println((numInt+numDouble).javaClass.kotlin.simpleName) // 輸出: Double
    
    println(1.999.toInt()) // 1 小數點後直接丟失
    println(1.9999999999999999.toInt()) //2  轉型Int Double 9到小數點後16位會變成2
    
    println(1.9999F.toDouble()) // 1.999899983406067 精確度丟失
	println(1.9999.toFloat()) // 1.9999
}

整體寫起來較方便
但同時帶來的是可能讓你忽略精準度遺失問題
這其實偏開發習慣了
是要開發時方便順手
還是之後程式可讀性與可維護性比較高

kotlin & Swift 差異

到目前為止 轉型算是兩種語言間
差異較大的部分
此系列想探討 開發差異與工程師可否同時開發這兩種語言
到目前為止 語法差異只要瞭解 問題就不大
如果同時開發兩種語言
個人偏向用同樣嚴謹的心態。
去撰寫kotlin & Swift 就可以拉~
畢竟身為Web開發者
踩過的各種型別的坑 多到數不清啊(淚
嚴謹~小心一點準沒錯

小碎嘴時間 ヽ(゚´Д`)ノ゚

啊拉~阿拉~
對現在的阿咪來說....
不斷看資料 文件 練習
很刻苦啊~

好想快點把開發工具打開來浪一浪
但現在只能暫時不斷啃書啊~~~~

好想快點脫離基礎
目前預計遊戲想來做個小雞遊戲
下午抽個空 來亂畫幾隻雞

過幾天我們一起聞雞起舞吧~~~~~~~~
ε=(;;:;::;)=3(好香好香~


上一篇
[Day05] swift & kotlin 入門篇!(3) 基礎語法-字串
下一篇
[Day07] swift & kotlin 入門篇!(5) 基礎語法-集合物件
系列文
雙平台APP小遊戲開發實作! Swift & Kotlin 攜手出擊~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言