Ios Apple Swift:类型转换泛型
我正在编写一些Swift代码,其中有一个包含泛型类型的数组:Ios Apple Swift:类型转换泛型,ios,generics,swift,Ios,Generics,Swift,我正在编写一些Swift代码,其中有一个包含泛型类型的数组: let _data: Array<T> = T[]() let_data:Array=T[]() 在后面的代码中,我需要确定数组中存储的类型。我尝试使用中描述的类型转换技术(尽管它没有用于泛型) switch self.\u数据{ case let doubleData作为数组: //用doubleData做点什么 案例让数据作为数组: //对浮动数据做些什么 违约: 返回nil//如果数据类型未知,则返回nil }
let _data: Array<T> = T[]()
let_data:Array=T[]()
在后面的代码中,我需要确定数组中存储的类型。我尝试使用中描述的类型转换技术(尽管它没有用于泛型)
switch self.\u数据{
case let doubleData作为数组:
//用doubleData做点什么
案例让数据作为数组:
//对浮动数据做些什么
违约:
返回nil//如果数据类型未知,则返回nil
}
上述switch语句在编译时会导致以下错误:
谁知道如何将我的通用数据转换到它的实际类型以采取特定的动作?
< p>在SWIFT,<代码> AS < /C>操作程序中的代码是“C++中的代码>动态DistaCase< /Cord>,它可以用于<强>下投< /强>对象。< /P> 假设您有一个类型为a
的对象a
,并且只有当类型B
与类型a
相同,或者B
是a
的子类时,您才能将设为B
在您的情况下,Array
显然不能总是向下转换为Array
或Array
,因此编译器会报告错误
一个简单的解决方法是首先转换为任何对象
,然后向下转换为数组
或数组
:
让anyData:AnyObject=self.\u data;
切换任意数据{
case let doubleData as?Array://使用as?运算符,而不是as,
//避免运行时异常
//用doubleData做点什么
case let floatData as?数组:
//对浮动数据做些什么
违约:
返回nil//如果数据类型未知,则返回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
如果您尝试在下面这样的开关情况下使用as,它将不起作用。编译器(Swift 1.2 Xcode 6.3b1)说:“不能使用[NSButton]类型的下行模式。”
称之为限制。将雷达与您的用例一起归档。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")
}
在操场上试试。希望有帮助!尝试使用
作为?
但我认为在你的情况下,这是一个编译器错误…报告它!我尝试了可选的,但它不起作用。我同意这可能是一个编译器错误。这不是我见过的第一个与泛型相关的错误…谢谢你的帮助,但我尝试了你的解决方案,但没有用-尽管你的解释n是有帮助的。我意识到数组不能总是向下转换为数组或数组,但这不是switch语句的目的吗?这真的不重要…我认为这是编译器的错误。此外,使用As?运算符只会产生另一个错误。Apple文档(见上面的链接)不使用As?运算符,而仅使用As运算符。
switch views {
case let buttons as [NSButton]:
println("Buttons")
default:
println("something else")
}
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")
}