El método supportedInterfaceOrientations no anula ningún método de su superclase

En un UIViewController, este código:

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

da el error El Method doesn't override any method from its superclass

Estoy utilizando Xcode 8 beta 4 y el objective de implementación de iOS es 9.0, y la Use Legacy Swift Language Version está establecida en No en la Build Settings

¿Cómo podría convertir el código de arriba a Swift 3?

Me gusta esto:

 override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 

… y el rest como lo tienes.

El patrón general

Muchos métodos de Cocoa son propiedades ahora, por lo que los implementan para anular las variables calculadas. Entonces el patrón para pasar de la semilla 3 (o anterior) a la semilla 4 es:

  • Cambiar func a var

  • Eliminar ()

  • Cambiar -> a :

Esto funciona porque una variable calculada tiene una función getter, por lo que la función que estaba implementando antes simplemente se convierte en la función getter. Y estas son propiedades de solo lectura, por lo que no necesitará un colocador.

De manera similar, los métodos afectados son preferredStatusBarStyle , prefersStatusBarHidden , shouldAutorotate , preferredInterfaceOrientationForPresentation y muchos otros. Busque UIKIT_DEFINE_AS_PROPERTIES en el encabezado Objective-C.

Trascendencia

A más largo plazo, hay otros cambios que puede hacer. Por ejemplo, puede agregar un setter (dividiendo su implementación en funciones get y set ), y así puede convertir su implementación en una fachada para una propiedad almacenada. Por ejemplo:

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

Entonces, ahora su código tiene una forma de establecer este valor. Si devolviera valores diferentes en momentos diferentes, esto podría hacer las cosas mucho más limpias.

Otras notas técnicas

Curiosamente, este cambio no tiene un efecto directo en el código Objective-C existente, porque en Objective-C, la nueva statement de propiedad, @property(nonatomic, readonly) UIInterfaceOrientationMask supportedInterfaceOrientations; , se satisface con el mismo método que antes:

 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

La razón es que en Objective-C, una @property(readonly) es simplemente una promesa de que existe un método getter correspondiente, y eso es exactamente lo que es este método. Pero en Swift, la forma de escribir el método getter de una propiedad de Objective-C es a través de una propiedad , es decir, a través de una variable de instancia. Entonces, solo el código Swift se ve afectado por el cambio: debe volver a escribir sus métodos como propiedades.