键入检查具有泛型类型的类

tre*_*r-e 5 swift

我有一个类似的课程 SomeController<A where A: ProtA>

我有一些子类 SubController: SomeController<SubA>

这是我如何尝试键入检查的工作示例:

protocol SomeProtocol {

}

class SuperClass<A where A: SomeProtocol> {

}

class SubProtocol: SomeProtocol {

}

class SubClass: SuperClass<SubProtocol> {

}

func classTest<A where A: SomeProtocol>(classToTest: SuperClass<A>) {
    switch classToTest {
    case is SubClass: // Has warning 'Cast from SuperClass<A> to SubClass always fails'
        print("I'm a SubClass")

    default:
        print("Wasn't found")
    }
}

classTest(SubClass()) // Prints "I'm a SubClass"
Run Code Online (Sandbox Code Playgroud)

从功能上来说,代码完全符合我的要求,但是,我留下了大量的警告 Cast from SuperClass<A> to SubClass always fails

显然这些类型是相关的,显然代码运行良好并且不会"总是失败",所以这个警告似乎是错误的.这是类型系统的当前限制或边缘情况,还是有办法使警告消失?

bra*_*tky 0

将 SuperClass 定义为它自己的泛型会抑制警告。我也不认为您需要一个 where 子句来指定 A 符合 SomeProtocol。

func classTest<A:SomeProtocol, B:SuperClass<A>>(classToTest: B, useA:A) {

    switch classToTest {
    case is SubClass: // Has warning 'Cast from SuperClass<A> to SubClass always fails'
        print("I'm a SubClass")

    default:
        print("Wasn't found")
    }
}
Run Code Online (Sandbox Code Playgroud)