2015-10-07 4 views
0

У меня есть общий Container структуру, которая хранится в контейнере класса, который реализует протокол, как показано ниже:Как применять наследование для дженериков в Swift

protocol Protocol {} 
class Class : Protocol {} 
struct Container<Element> { 
    var value:Element 
    init(_ v:Element) { value = v } 
} 
class Example { 
    var container : Container<Class> 
    init() { container = Container(Class()) } 
    func getContainer() -> Container<Protocol> { return container } 
} 

Однако, когда я прохожу его, я хочу, чтобы передать его как контейнер только протокол, который генерируется ошибка на return container:

Cannot convert return expression of type 'Container<Class>' to return type 'Container<Protocol>' 

Я знаю, что это должно быть возможно, как Swift делает это с массивами, как показано ниже:

class ArrayExample { 
    var arrayContainer : [Class] 
    init() { arrayContainer = [Class()] } 
    func getArrayContainer() -> [Protocol] { return arrayContainer } 
} 

Так есть ли какие-либо мысли о том, как реализовать контейнер так, что преобразование/копия не создает ошибку

+0

Но вы не можете объявить '' container' как вар контейнера: контейнер '? – matt

+0

Я могу объявить контейнер контейнером , но внутри класса я хочу получить доступ к переменной/функциям, которые не находятся в протоколе –

+0

И вы не можете отказаться от этого класса, чтобы получить доступ к этим переменным/функциям? – matt

ответ

0

Это не ясно, что вы на самом деле пытаетесь достичь, но вот код, который компилируется и охватывает все цели, которых вы искали до сих пор:

protocol Protocol {} 
class Class : Protocol { 
    var thing : AnyObject? 
} 
class Container<Element> { 
    var value:Element 
    init(_ v:Element) { value = v } 
} 
class Example { 
    var container : Container<Protocol> 
    init() { container = Container(Class()) } 
    func getContainer() -> Container<Protocol> { return container } 
    func doStuff() { 
     if let v = container.value as? Class { v.thing = "ha" } 
    } 
} 
Смежные вопросы