Могу ли я получить проверки во время компиляции для неявно развернутых опций в контроллерах представления в Swift (4)? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть класс, который выглядит следующим образом (упрощенно):

class GuideViewController: UIViewController, StoreSubscriber {
    var tileRenderer: MKTileOverlayRenderer! // <------ this needs to be set by whoever instantiates this class
    override func viewDidLoad() {
        super.viewDidLoad()
         ...
    }
}

Мое приложение использует этот класс GuideViewController для отображения множества различных стилей карт, поэтому переменная экземпляра tileRenderer может иметь много разных значений.

Мне нужна гарантия времени компиляции, что tileRenderer никогда не будет nil, вместо использования неявно развернутого необязательного параметра.

Как мне этого добиться?

Вещи, которые я рассмотрел до сих пор, но не уверен насчет

  • Установка tileRenderer в методе init() в GuideViewController. Это был мой первый инстинкт , этот ответ подразумевает, что это невозможно, или антипаттерн.
  • Настройка tileRenderer в viewDidLoad(). Кажется, для этого требуется использовать неявно развернутый необязательный параметр, который обходит проверки во время компиляции. Также у меня сложилось впечатление, что viewDidLoad() вызывается только один раз для контроллера представления в жизненном цикле приложения
  • Ручная настройка tileRenderer после создания экземпляра VC. Например,

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "GuideViewController")
    vc.tileRenderer = MKTileOverlayRenderer(...) // <----- can I make the compiler force me to write this line?
    navigationController?.pushViewController(vc!, animated: true)
    

Простите, что задал такой наивный вопрос - я довольно новичок в разработке под iOS.

1 Ответ

0 голосов
/ 31 октября 2018

Невозможно выполнить проверку во время компиляции, поскольку это потребует от компилятора полного анализа потока вашей программы.

Вы не можете сделать это свойство необязательным (ну, вы можете - см. Пункт 4), поскольку для этого требуется пользовательский инициализатор, который на самом деле не работает с UIViewController подклассами.

У вас есть несколько вариантов:

  1. Использовать неявно развернутый необязательный параметр и вылетать во время выполнения, если оно равно nil - надеюсь, разработчик быстро обнаружит их ошибку

  2. Проверьте nil в подходящей точке (например, viewWillAppear) и выдайте предупреждение консоли, после чего произойдет сбой при попытке доступа к значению или вызову fatalError - это даст разработчик больше намекает на то, что они сделали неправильно

  3. Используйте опционально и разверните его перед использованием

  4. Используйте необязательные и укажите значение по умолчанию

Вариант 4 может быть лучшим вариантом; Предоставьте рендеринг по умолчанию, который ничего не делает (или, возможно, выдает предупреждение для журнала консоли, что это рендерер по умолчанию и что разработчик должен его предоставить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...