2014-06-22 96 views
6

我正在写一些银行代码,我有一个包含一个泛型类型的数组:苹果斯威夫特:类型转换泛型

let _data: Array<T> = T[]() 

在我的代码后来我需要确定存储在数组中的类型。我尝试使用documentation中描述的类型铸造技术(虽然它不用于泛型)。

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语句导致以下错误在编译:

  1. While emitting IR SIL function @_TFC19Adder_Example___Mac6Matrix9transposeUS_7Element__fGS0_Q__FT_GSqGS0_Q___ for 'transpose' at /code.viperscience/Adder/src/Adder Library/Matrix.swift:45:3 :0: error: unable to execute command: Segmentation fault: 11 :0: error: swift frontend command failed due to signal (use -v to see invocation) Command /Applications/Xcode6-Beta2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254

任何人都知道我能投我的通用数据存储到其实际类型,以便采取具体行动?

+0

尝试使用'as?',但我认为在你的情况下它的编译器错误...报告! – Jack

+1

我试过可选,但没有奏效。我同意它可能是一个编译器错误。这不是我见过的与泛型有关的拳头... – nalyd88

回答

1

假设你有按钮的排列:

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]类型的向下模式。”

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") 
} 

尝试在一个游乐场。希望能帮助到你!

2

在swift中,as运算符类似于C++中的dynamic_cast,它可用于下拉对象

假设有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 
+0

谢谢你的帮助,但我试过你的解决方案无济于事 - 虽然你的解释是有帮助的。我意识到阵列不能总是被下拉到阵列或阵列,但是不是那switch语句是什么?这真的没关系......我认为这是编译器的错误。另外,使用As?运算符仅生成另一个错误。 Apple文档(请参阅上面的链接)不使用As?运算符而只是As运算符。 – nalyd88