быстрое ограничение VAR типов [дубликат]

new_list = list(old_list)

40
задан Frank Schmitt 9 August 2014 в 02:44
поделиться

2 ответа

Я думаю, вы можете добраться туда, добавив (пустое) расширение к UIViewController, а затем указав свой атрибут detailViewController, используя составленный протокол пустого расширения и ваш DetailViewController. Например:

protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

Теперь все подклассы UIViewController удовлетворяют протоколу UIViewControllerInject. Тогда с этим просто:

typealias DetailViewControllerComposed = protocol<DetailViewController, UIViewControllerInject>

class MasterViewController : UITableViewController {
  var detailViewController : DetailViewControllerComposed?
  // ...
}

Но это не особенно «естественно».

=== Edit, Дополнение ===

Фактически , вы можете сделать это немного лучше, если вы определите свой DetailViewController, используя мой предложенный UIViewControllerInject. Например:

protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}

protocol DetailViewController : UIViewControllerInject { /* ... */ }

, и теперь вам не нужно явно что-то компилировать (мой DetailViewControllerComposed) и использовать DetailViewController? как тип для detailViewController.

13
ответ дан GoZoner 21 August 2018 в 17:00
поделиться
  • 1
    Я не очень взволнован, что каждый подкласс UIViewController будет иметь свойство viewModel, но, по крайней мере, он компилирует вещи :) – Frank Schmitt 11 August 2014 в 17:08
  • 2
    Нет, я не говорю об этом. Протокол, добавленный в UIViewController , является пустым ! – GoZoner 11 August 2014 в 19:20
  • 3
    Ooohhh. Очень умно :). – Frank Schmitt 12 August 2014 в 22:14
  • 4
    @FrankSchmitt, что, если я хочу var detailViewController: DetailViewController быть подклассом UIViewController строго? Точно так же ясно, как объявление @property (strong, nonatomic) UIViewController<DetailViewController> detailViewController; в Objective-C. Возможно ли, чтобы Свифт это сделал? – liuyaodong 29 October 2014 в 14:29
  • 5
    Это решает проблему в одностороннем порядке - но тогда, когда вы UIViewControllerInject прошли где-то в коде, вы не можете вызвать какой-либо метод UIViewController на нем без принудительного каста (as!). К сожалению, я считаю, что в настоящее время нет возможности объявить переменную как определенный класс, соответствующий определенному протоколу, как это возможно в ObjC. Вы можете, конечно, объявить все методы, которые вам нужны из UIViewController в протоколе UIViewControllerInject. – Charlie Monroe 25 December 2015 в 10:34

Другим способом было бы ввести промежуточные базовые классы для соответствующих контроллеров представления UIKit, которые реализуют протокол:

class MyUIViewControler : UIViewController, DetailViewController ...
class MyUITableViewController : UITableViewController, DetailViewController ...

. Затем вы наследуете контроллеры представлений от этих контроллеров представления, а не UIKit.

Это тоже не является естественным, но это не заставляет всех ваших UIViewControllers удовлетворять протоколу UIViewControllerInject, как предлагал GoZoner.

2
ответ дан tng 21 August 2018 в 17:00
поделиться
  • 1
    Я пошел по этому маршруту, но я не уверен, как объявить свойство, которое может быть либо типа MyUIViewController, либо MyUITableViewController. – Frank Schmitt 11 August 2014 в 16:31
Другие вопросы по тегам:

Похожие вопросы: