2015-03-19 71 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