從型別 A 的東西得到型別 B 的東西

就像人跟鬼不能在一起,當我們在程式裡將東西儲存到變數時,東西的型別必須符合變數的型別,但時常我們手上的東西卻是另外一個型別,因此必須想盡辦法生出變數需要的東西。

假設原本的東西是型別 A,而我們需要的東西是型別 B,開發 iOS App 時常見的解法有以下兩種:

解法1: 利用 型別B(參數: 型別A) 生出型別 B 的東西。

從浮點數生出整數,因此 number2 會得到 10。

let number1 = 10.3
let number2 = Int(number1)

解法2: 讀取型別 A 東西的 property,剛好此 property 的型別為型別 B。

以設定 label 的邊框顏色為例。

let label = UILabel()
label.layer.borderWidth = 10
label.layer.borderColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1).cgColor

borderColor 的型別是 CGColor,但我們在程式裡習慣產生的顏色的型別卻是 UIColor,因此我們得想辦法從 UIColor 生出 CGColor。

borderColor 的型別是 CGColor,因此不接受型別 UIColor 的東西

也許你會想依樣畫葫蘆,猜想是否能用 CGColor( ) ,然後在 ( ) 裡傳入 型別 UIColor 的資料生出型別 CGColor 的東西?

很可惜從自動完成的提示,我們發現不行,它的參數型別不是 UIColor。

其實在這裡有更簡單的方法。我們可以直接讀取 UIColor 的 property cgColor。它就是我們要的,因為它的型別恰恰為 CGColor。

label.layer.borderColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1).cgColor

iOS SDK 裡還有許多類似這樣運氣好可以直接讀取 property 的例子,比方以下 CAShapeLayer 的 path 型別為 CGPath,因此我們無法儲存 UIBezierPath 型別的 bezierPath ,而須讀取它的 property cgPath(型別為 CGPath)。

let bezierPath = UIBezierPath()
let triangleLayer = CAShapeLayer()
triangleLayer.path = bezierPath.cgPath

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com