Метод supportInterfaceOrientations не переопределяет ни один метод из своего суперкласса

В UIViewController этот код:

public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if let mainController = self.mainViewController{
        return mainController.supportedInterfaceOrientations
    }
    return UIInterfaceOrientationMask.all
}

выдает ошибку Method doesn't override any method from its superclass

Я использую Xcode 8 beta 4, цель развертывания iOS - 9.0, и Use Legacy Swift Language Version установлен на Нет в Build Settings

Как я могу преобразовать код выше в Swift 3?

1 ответ

Решение

Как это:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {

... а остальное как есть.

Общая картина

Многие методы Какао теперь являются свойствами, поэтому вы реализуете их как переопределенные вычисляемые переменные. Таким образом, схема перехода от семени 3 (или ранее) к семени 4:

  • + Изменить func в var

  • удалять ()

  • + Изменить -> в :

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

Подобным образом затрагиваемые методы preferredStatusBarStyle, prefersStatusBarHidden, shouldAutorotate, preferredInterfaceOrientationForPresentation, и много других. Ищу UIKIT_DEFINE_AS_PROPERTIES в заголовке Objective-C.

Последствия

В более долгосрочной перспективе вы можете внести другие изменения. Например, вы можете добавить сеттер (разделив вашу реализацию на get а также set функции), и, таким образом, вы можете превратить свою реализацию в фасад для хранимого свойства. Например:

private var _orientations = UIInterfaceOrientationMask.portrait
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    get { return self._orientations }
    set { self._orientations = newValue }
}

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

Дальнейшие технические заметки

Интересно, что это изменение не имеет прямого влияния на существующий код Objective C, потому что в Objective C, новое объявление свойства, @property(nonatomic, readonly) UIInterfaceOrientationMask supportedInterfaceOrientations;, удовлетворяется тем же методом, что и раньше:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

Причина в том, что в Objective-C, @property(readonly) просто обещание, что существует соответствующий метод получения, и это именно то, что этот метод. Но в Swift способ написания метода-получателя свойства Objective-C лежит через свойство, то есть через переменную экземпляра. Таким образом, изменение влияет только на код Swift: вы должны переписать ваши методы как свойства.

Другие вопросы по тегам