2016-02-12 2 views
6

Я пытаюсь сделать это, но я получаю некоторые неприятностиSwift дженерики отложили выпуск

Это CustomProtocol

protocol CustomProtocol { 

} 

SubCustomProtocol

protocol SubCustomProtocol: CustomProtocol { 

} 

SubCustomProtocolImplementation

class SubCustomProtocolImplementation: SubCustomProtocol { 

} 

Это CustomClass

class CustomClass<P: CustomProtocol> { 

    var customProtocol: P? 

    func doSomething() { 

    } 

} 

SubCustomClass

class SubCustomClass<P: SubCustomProtocol>: CustomSubClass { 

} 

И мой BaseViewController

class BaseViewController<P: CustomProtocol, T: CustomClass<P>>: UIViewController { 

    var foo: T! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     foo?.doSomething() 
    } 
} 

Мои ViewController

class ViewController<P: SubCustomProtocolImplementation, T: SubCustomClass<P>>: BaseViewController<P,T> { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

В строке, где я называю Foo? .doSomething() его говорит что «T» не является подтипом «CustomClass <„Р“>», и я не знаю, что я делаю неправильно

И в декларации ViewController он говорит, что «BaseViewController требует , что T унаследован от CustomClass < 'P'> "

Надеюсь, вы можете мне помочь!

+0

Я не получаю эту ошибку. По крайней мере, на детской площадке. Вы уверены, что предоставляете полный контекст? – iyuna

+0

@Iyuna Мне не хватало чего-то жаль! Я отредактировал вопрос –

+1

Кажется, параметр типа не может быть ограничен общим классом. Это может быть ограничено классом или протоколом. – CouchDeveloper

ответ

2

Если вы хотите указать свой тип foo var как CustomClass<P>, вы должны сделать следующее.

class ViewController<P: CustomProtocol>: UIViewController { 

    var foo: CustomClass<P>? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     foo?.doSomething() 
    } 
} 
+0

спасибо, что я знаю, я не очень хорошо объяснял это, я снова редактировал свой вопрос –

Смежные вопросы