2016-12-12 6 views
0

У меня есть шаблон, где я создаю UIViewControllers, которые реализуют определенный протокол. Поскольку мне нужно, чтобы они были настоящими UIViewControllers, чтобы иметь возможность нажимать их на стек, они всегда должны быть UIViewControllers, а не случайным классом, реализующим протокол.UIViewController, реализующий протокол как параметр или возвращаемый тип

Сначала я думал, что могу ограничить протокол, но я не мог понять это. Если у вас есть идея, как решить проблему в источнике, это будет даже лучше. Тем не менее, как возвращение типа это казалось мне повезло больше:

https://briancoyner.github.io/2015/11/14/swift-protocol-that-returns-protocol.html

protocol ModalViewControllerProvider { 

    typealias V: UIViewController, ModalPresentationCompletion 

    func viewControllerWithObject(object: AnyObject) -> V 
} 

Этот пример не работает в Swift 3 однако, и я не мог заставить его работать, кроме как с составом протокола, который не работает для UIViewController.

Я могу обойти это, вернув UIViewController, затем перейдя на ModalPresentationCompletion, но это немного странно для других программистов.

Могу ли я заверить либо в объявлении самого протокола, либо путем создания чего-то вроде типалиасов, подобных описанному выше, чтобы гарантировать, что он всегда реализует UIViewController и определенный протокол?

ответ

1

После последних изменений этого типа псевдонимов выглядит следующим образом:

typealias V = UIViewController & ModalPresentationCompletion 

Испытан в Swift 4

+0

Это новое в Swift-справа? Или это также синтаксис Swift 3? –

+0

Теперь я не могу проверить Swift 3. Возможно, он работает на обоих диалектах, но я не могу этого гарантировать. – Alexey

+0

Ну, в любом случае, я больше не был заинтересован в ответе Swift 3! Так что спасибо! –