Generics swift中的泛型类型错误
在playgroud中运行以下代码后,为什么x值为2? swift泛型类型和“Is”运算符是否有任何错误? 类项{}Generics swift中的泛型类型错误,generics,swift,func,downcast,Generics,Swift,Func,Downcast,在playgroud中运行以下代码后,为什么x值为2? swift泛型类型和“Is”运算符是否有任何错误? 类项{} class Campaign: Item {} class AdGroup : Item {} class A<T: Item> { func val() -> Int{ let item = T() if item is Campaign { return 1 } else {
class Campaign: Item {}
class AdGroup : Item {}
class A<T: Item> {
func val() -> Int{
let item = T()
if item is Campaign {
return 1
} else {
return 2
}
}
}
var m = A<Campaign>()
let x = m.val()
类活动:项{}
类AdGroup:项{}
甲级{
func val()->Int{
设item=T()
如果项目是活动{
返回1
}否则{
返回2
}
}
}
var m=A()
设x=m.val()
看起来像个bug。我在调试配置中得到“2”,在发布配置中得到“1”。(这提醒了我,它只会在调试模式下给出错误的结果。)这是一个bug还是仅仅表现出未定义的行为还存在争议。严格来说,当检查保证成功时,不允许使用“是”(例如,10,因为Int
是不允许的)。在本例中,“is”保证会成功,因为T
是一个Campaign
(如图所示调用时),所以它可能会产生编译错误。奇怪。。。如果活动
需要初始化一个参数,该怎么办。(即,活动
没有int()
)?似乎未调用活动
初始化器。此处未显示项
的定义–要编译此代码,它必须定义一个init()
方法。如果Item
定义了一个init
,它使用了字符串
,您可以在val()
中使用它,但不能在init()
中使用它。有趣的是,如果将项目
定义为一个协议而不是一个类,那么这个问题就会消失(尽管这不可能发生在这里,因为活动
需要进行不同的定义)。相关: