2016-09-22 2 views
0

Я хочу иметь функцию в swift, которая принимает два параметра, которые должны иметь некоторый базовый класс, и каждый сталкивается с другим протоколом.Несколько общих параметров в Swift

class func createContainerViewController<T:UIViewController, U:UIViewController>(withCenterViewController centerViewController: T, andLeftViewController leftViewController: U) -> ContainerViewController where T: CenterViewController, U: SidePanelViewController 

Но всякий раз, когда я пытаюсь использовать метод как это:

let left: SidePanelViewController = UIStoryboard.leftViewController()! 
let center: EventsListViewController = UIStoryboard.eventsListViewController()! 

let containerViewController = ContainerViewController.createContainerViewController(withCenterViewController: center, andLeftViewController: left) 

Xcode дает мне ошибку

Общий параметр 'T' не может быть выведено

Обе переменные центра и слева являются экземплярами классов, которые наследуются от UIViewController и противостоит до нужного протокола для T или U.

Использование в функции createContainerViewController:

let container = ContainerViewController() 

container.centerViewController = centerViewController 
var centerViewController = container.centerViewController as! CenterViewController 
centerViewController.delegate = container 

container.leftViewController = leftViewController 
var leftViewController = container.leftViewController as! SidePanelViewController 
leftViewController.delegate = container 

return container 
+0

Ваши две строки кода в порядке до тех пор, как '' CenterViewController' и SIdePanelViewController' оба подклассы 'UIViewController'. Как вы используете 'T' и' U' в теле функции? (Кроме того, попробуйте в XCode 8 с быстрым 3, если вы еще этого не сделали) – DavidA

+0

Я использую Xcode 8 и Swift 3. И в центре и влево находятся оба подкласса UIViewController и реализующие правильные протоколы ... – Radek

+0

Добавлено использование в func , – Radek

ответ

0

Это должно работать.

protocol CenterViewController {} 
protocol SidePanelViewController {} 

class Center: UIViewController, CenterViewController {} 
class Left: UIViewController, SidePanelViewController {} 

class ContainerViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let center = Center() 
     let left = Left() 
     let _ = ContainerViewController.createContainerViewController(withCenterViewController: center, andLeftViewController: left) 
    } 

    class func createContainerViewController<T:UIViewController, U:UIViewController>(withCenterViewController centerViewController: T, andLeftViewController leftViewController: U) -> ContainerViewController where T: CenterViewController, U: SidePanelViewController { 
     return ContainerViewController() 
    } 
} 
+0

Да, он должен, но не ... – Radek

+0

Он строит для меня в Xcode 8, какую версию swift и xcode вы используете? – Sam

+0

Я использую Xcode 8. Я добавил дополнительную информацию в вопрос. – Radek

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