Generics swift中的泛型类型错误

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 {

在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 {
            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()
中使用它。有趣的是,如果将
项目
定义为一个协议而不是一个类,那么这个问题就会消失(尽管这不可能发生在这里,因为
活动
需要进行不同的定义)。相关: