Метод 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: вы должны переписать ваши методы как свойства.