2015-03-19 69 views
2

我有这个协议,类和一个类需要一个通用的,必须符合两者。如何在Swift中使用泛型和多继承的变量?

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

考虑这个例子:

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>] = [] 

} 

回答

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继承,这就是为什么会出现错误。

更新 为了使它不那么restritive

这是怎么

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。另一种方法是放弃泛型并使用接口或基类。

+0

难道这不会使解决方案比所需的更具体吗?你可以在这里定义多处的使用情况吗?这不是很奇怪吗? – 2015-03-19 11:41:25

+0

@KevinR你说得对。这是更严格的,你表达的想法。 – 2015-03-19 12:43:31

+0

然后我们必须使注册表成为一个通用类。我用一个例子更新了我的答案。 – NebulaFox 2015-03-19 13:31:28