nal*_*d88 6 generics ios swift
我正在写一些Swift代码,其中我有一个包含泛型类型的数组:
let _data: Array<T> = T[]()
Run Code Online (Sandbox Code Playgroud)
稍后在我的代码中,我需要确定存储在数组中的类型.我尝试使用文档中描述的类型转换技术(尽管它没有用于泛型).
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
}
Run Code Online (Sandbox Code Playgroud)
上面的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
有人知道如何将我的通用数据转换为实际类型以采取特定的行动吗?
假设您有一个按钮数组:
let views: [NSView] = [NSButton(), NSButton(), NSButton()]
Run Code Online (Sandbox Code Playgroud)
您可以使用这些转换:
let viewsAreButtons = views is [NSButton] // returns true
let buttonsForSure = views as! [NSButton] // crashes if you are wrong
let buttonsMaybe = views as? [NSButton] // optionally set
Run Code Online (Sandbox Code Playgroud)
如果您尝试在如下所示的开关盒中使用 as ,它将不起作用。编译器(Swift 1.2 Xcode 6.3b1)说:“无法使用 [NSButton] 类型的向下转型模式。”
switch views {
case let buttons as [NSButton]:
println("Buttons")
default:
println("something else")
}
Run Code Online (Sandbox Code Playgroud)
称之为限制。将雷达与您的用例一起归档。Swift 团队似乎确实在倾听反馈。如果您确实想让它工作,您可以定义自己的模式匹配运算符。在这种情况下,它会是这样的:
struct ButtonArray { }
let isButtonArray = ButtonArray()
func ~=(pattern: ButtonArray, value: [NSView]) -> Bool {
return value is [NSButton]
}
Run Code Online (Sandbox Code Playgroud)
然后这有效:
switch views {
case isButtonArray:
println("Buttons") // This gets printed.
default:
println("something else")
}
Run Code Online (Sandbox Code Playgroud)
在游乐场尝试一下。希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
5238 次 |
| 最近记录: |