如何在Swift中使用泛型键入和多重继承?

时间:2015-03-19 10:12:11

标签: swift generics

我有这个协议,类和一个类,它采用必须符合两者的泛型。

我想构建一个包含此类类数组的注册表,但是如何在注册表中定义一个满足编译器的变量?

考虑这个例子:

protocol SomeProtocol {

}

class SomeClass {

}

class AnotherClass<R, P where P:SomeProtocol, P:SomeClass> {

}

class Registry {

    private init() {}

    // This is not allowed since the second generic doesn't conform to neither required class
    var registry:[AnotherClass<AnyObject, AnyObject>] = [] 

}

1 个答案:

答案 0 :(得分:0)

这就是

import UIKit
protocol SomeProtocol {

}

class SomeClass {

}

class AnotherClass<R, P where P:SomeProtocol, P:SomeClass> {

}

class TheClass : SomeClass, SomeProtocol {}

class Registry {

    private init() {}

    var registry:[AnotherClass<AnyObject, TheClass>] = []

}

您需要定义一个继承SomeClassSomeProtocol的类。 AnyObject不会继承SomeClassSomeProtocol,这就是您收到错误的原因。

<强>更新 为了减少其重复性

这就是

import UIKit
protocol SomeProtocol {

}

class SomeClass {

}

class AnotherClass<R, P where P:SomeProtocol, P:SomeClass> {

}

class TheClass : SomeClass, SomeProtocol {}

class Registry<T, where T:SomeProtocol, T:SomeClass> {

    private init() {}

    var registry:[AnotherClass<AnyObject, T>] = []

}

更新2

但是,最终,你最终会得到像

这样的东西
Registry<TheClass>

因为泛型最终需要一个具体的类。

您可以做的是在运行时强制执行该类型 - 您需要通过@objc向协议添加is。另一种方法是废弃泛型并使用接口或基类。