[英]Apple Swift: Type Casting Generics
我正在寫一些Swift代碼,其中我有一個包含泛型類型的數組:
let _data: Array<T> = T[]()
稍后在我的代碼中,我需要確定存儲在數組中的類型。 我嘗試使用文檔中描述的類型轉換技術(盡管它沒有用於泛型)。
switch self._data {
case let doubleData as Array<Double>:
// Do something with doubleData
case let floatData as Array<Float>:
// Do something with floatData
default:
return nil // If the data type is unknown return nil
}
上面的switch語句在編譯時導致以下錯誤:
- 在/code.viperscience/Adder/src/Adder Library / Matrix.swift:45:3:0:錯誤:無法執行命令時發出IR SIL函數@ _TFC19Adder_Example ___ Mac6Matrix9transposeUS_7Element__fGS0_Q__FT_GSqGS0_Q___ for'transpose':分段錯誤:11:0:錯誤: swift前端命令因信號失敗(使用-v查看調用)命令/Applications/Xcode6-Beta2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift失敗,退出代碼為254
有人知道如何將我的通用數據轉換為實際類型以采取特定的行動嗎?
在迅速, as
操作者是一樣的東西dynamic_cast
在C ++中,這可以向下澆鑄的對象一起使用。
說你有一個對象a
類的A
,並且可以編寫let a as B
,只有當類型B
相同類型A
,或B
是子類的A
。
在您的情況下,顯然Array<T>
不能總是向下轉換為Array<Double>
或Array<Float>
,因此編譯器報告錯誤。
一個簡單的解決方法是首先轉換為AnyObject
,然后向下轉換為Array<Double>
或Array<Float>
:
let anyData: AnyObject = self._data;
switch anyData {
case let doubleData as? Array<Double>: // use as? operator, instead of as,
// to avoid runtime exception
// Do something with doubleData
case let floatData as? Array<Float>:
// Do something with floatData
default:
return nil // If the data type is unknown return nil
假設您有一組按鈕:
let views: [NSView] = [NSButton(), NSButton(), NSButton()]
你可以使用這些演員表:
let viewsAreButtons = views is [NSButton] // returns true
let buttonsForSure = views as! [NSButton] // crashes if you are wrong
let buttonsMaybe = views as? [NSButton] // optionally set
如果您嘗試使用如下所示的開關盒,它將無法工作。 編譯器(Swift 1.2 Xcode 6.3b1)說:“不能使用[NSButton]類型的Downcast模式。”
switch views {
case let buttons as [NSButton]:
println("Buttons")
default:
println("something else")
}
稱之為限制。 使用您的用例提交雷達。 Swift團隊真正接受了反饋。 如果您真的想讓它工作,您可以定義自己的模式匹配運算符。 在這種情況下,它將是這樣的:
struct ButtonArray { }
let isButtonArray = ButtonArray()
func ~=(pattern: ButtonArray, value: [NSView]) -> Bool {
return value is [NSButton]
}
然后這工作:
switch views {
case isButtonArray:
println("Buttons") // This gets printed.
default:
println("something else")
}
在游樂場嘗試一下。 希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.