将泛型子类型约束的对象传递给方法时的Swift编译时错误

时间:2017-01-05 01:05:51

标签: ios swift generics

我有一个泛型类的类,泛型类型有一个子类类型约束。然后我尝试将类的实例传递给方法,但最终得到以下编译时错误:

 Cannot convert value of type 'B<SomeType>' to expected argument type 'B<NSObject>'

下面是一个简单的例子:

class A: NSObject {

    func testB(b: B<NSObject>) {

    }
}

class B<SomeType: NSObject>: NSObject {

    func test() {
        let a = A()
        a.testB(b: self) // <----- The error noted above is shown here
    }
}

因为SomeType保证是NSObject的子类,所以我希望编译器可以将B<SomeType>转换为B<NSObject>并传递它。< / p>

A类只关心B&#39; SomeTypeNSObject的子类,而不是SomeType的实际类型。如果某个函数采用UIView参数并传入UILabel就好了。

1 个答案:

答案 0 :(得分:1)

变化:

func testB(b: B<NSObject>) {

}

要:

func testB<SomeType: NSObject>(b: B<SomeType>) {

}

这样可行,因为SomeType约束NSObject,不等于NSObject

因此,您的函数SomeType也应该约束到NSObject

func testB<SomeType: NSObject>(b: B<SomeType>) { ... }