2014-08-30 80 views
14

什麼是當前在Swift中定義顯式轉換的最佳/首選方式?我的頭頂,我可以想到兩個:在Swift中爲自定義類型定義顯式轉換

  • 通過擴展創建目標類型的自定義初始化,就像這樣:

    extension String { 
        init(_ myType: MyType) { 
        self = "Some Value" 
        } 
    } 
    

    這樣,你可以只使用String(m)其中m類型爲MyType將m轉換爲字符串。

  • 定義toType - 方法在源類型,如下所示:

    class MyType { 
        func toString() -> String { 
        return "Some Value" 
        } 
    } 
    

    這可比Swift的String.toInt(),它返回一個Int?。但是,如果這是最終的方式,我希望有一些基本類型的協議,例如已有的*LiteralConvertible協議的反轉。

子問題:這兩種方法都不允許這樣的事情編譯:let s: MyString = myTypeInstance (as String)(括號內爲選裝件),但如果我的理解對不對,該as運營商只對類型層次結構中向下轉型,是,正確?

回答

9

swift中使用的模式是初始值設定項。因此,例如轉換的IntUInt的時候,我們必須寫:

var i: Int = 10 
var u: UInt = UInt(i) 

我要堅持這種模式。

至於subquestion,文檔指出:

Type casting is a way to check the type of an instance, and/or to treat that instance as if it is a different superclass or subclass from somewhere else in its own class hierarchy.

You can also use type casting to check whether a type conforms to a protocol

所以沒有,則as關鍵字`噸被用於轉化某些類型的值到另一個類型。

,可以以簡單的方式進行測試:

var i: Int = 10 
var u: UInt = i as UInt 

生成錯誤:

'Int' is not convertible to 'UInt' 

更多Type Casting

+0

好的,謝謝。包括文檔在內也很好。我認爲爲轉換提供內置類型的擴展也是正確的做法? – Kolja 2014-08-30 19:45:29

+1

是的,當我們添加到第三方類型時,擴展是我們手中的工具。對於我們自己的代碼,這當然只是一個偏好問題。在某些情況下,使用擴展可以幫助保持我們的代碼更有組織性,更易於瀏覽。 – Antonio 2014-08-30 19:49:14

+1

再次感謝。現在我只需要隱式轉換,但是我不會從Swift中獲得。 ;-) – Kolja 2014-08-30 20:21:11