2015-01-28 2 views
1

В Objective-C вы можете сообщить компилятору, что тип должен быть потомком определенного класса, а также соответствовать протоколу (например, «UIViewController * foo = nil ").Передача параметра методу, который реализует протокол, и расширяет класс в swift

Я пытаюсь сделать что-то подобное с Swift, и похоже, что это требует использования дженериков. Вот что я хотел бы рассчитывать на работу:

import UIKit 

protocol MyProtocol { 
    var foo: String {get set} 
} 

class MyViewController: UIViewController, MyProtocol { 
    var foo: String = "" 
} 

func doAThing<T: UIViewController where T: MyProtocol>(vc: T) -> T? { 
    var myViewController: T? = nil 

    myViewController = MyViewController(nibName: nil, bundle: nil) 

    return myViewController 
} 

Ошибки я получаю: «MyViewController» не конвертируются в «T». Могу ли я использовать дженерики с «конкретными», непараметрированными классами? Я все еще обнимаю эту часть языка, спасибо за помощь.

+0

Что такое объявление MyView? –

+0

Я отредактировал мой пост, он должен был прочитать MyViewController. – uniquesnowflake8

ответ

0

Предполагая, что вы ожидаете MyViewController быть любой подкласс UIViewController, который реализует MyProtocol Обратите внимание, что там на самом деле не является чистым способом, чтобы вернуться к UIViewController методов короткие добавления что-либо отношение к протоколу.

Я думаю, что вы ищете это:

protocol MyProtocol { 
    var foo: String {get set} 
} 

class MyViewController: UIViewController, MyProtocol { 
    var foo: String = "" 
} 

class MyOtherViewController : UIViewController, MyProtocol { 
    var foo = "My other view controller" 
} 

func doAThing<T: UIViewController where T: MyProtocol>() -> T? { 
    return T(nibName: nil, bundle: nil) 
} 

let myViewController : MyViewController? = doAThing() 
let myOtherViewController : MyOtherViewController? = doAThing() 

let myProtocol : MyProtocol? = myViewController 

Поскольку стремительную функцию переопределяет разрешено отличаться только возвращаемым типом и вывод типа способен выбирать между ними, doAThing действительно не нуждается параметр в этом случае.

+0

Спасибо, это ответило на мой конкретный вопрос выше :) То, что я хотел бы сделать, это выбрать и установить определенный контроллер вида на основе определенного набора правил. Я мог бы опубликовать следующий вопрос ... – uniquesnowflake8

+0

Если следующее: «Как я могу объявить ссылку на подкласс UIViewController, который реализует MyProtocol, поэтому я могу использовать viewController.view?» ответ в значительной степени «вы не можете». Лучшей практикой на данный момент является добавление интересных методов UIViewController в MyProtocol. –

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