ios objective-c swift parse.com

ios - Método load() define el método de clase Objective-C ''load'', que no está permitido por Swift 1.2



parse.com (5)

Estoy llamando al método registerSubclass() en AppDelegate antes de Parse.setApplicationId para cada subclase de PFObject y funciona.

Estoy usando Parse y estoy creando una subclase PFObject conforme al protocolo PFSubclassing! Funcionaba bien, pero ahora estoy usando Swift 1.2 y me da este error:

1. override class func load() { 2. self.registerSubclass() 3. }

En la línea 1: Método ''load ()'' define el método de clase Objective-C ''load'', que no está permitido por Swift 1.2

¿Alguien tiene este problema todavía? ¿Cómo puedo arreglarlo?


Hay un artículo de NSHispster sobre el método Swizzling que toca esto en un contexto diferente:

Lamentablemente, el tiempo de ejecución nunca llama a un método de clase de carga implementado en Swift, lo que hace que esa recomendación sea imposible. En cambio, nos queda elegir entre las opciones de segunda opción:

  • Implementar el método swizzling en initialize. Esto se puede hacer de forma segura, siempre y cuando compruebe el tipo en el momento de la ejecución y ajuste el swizzling en dispatch_once (que de todos modos debería hacer).

  • Implementar el método swizzling en el delegado de la aplicación. En lugar de agregar swizzling de método a través de una extensión de clase, simplemente agregue un método al delegado de la aplicación para que se ejecute cuando se llame a la aplicación (_: didFinishLaunchingWithOptions :). Dependiendo de las clases que esté modificando, esto puede ser suficiente y debe garantizar que su código se ejecute todo el tiempo.

Enlace: http://nshipster.com/swift-objc-runtime/

-

Más información sobre los foros de desarrollo de dev:

Swift 1.1 le permitió definir métodos "+ carga" con "clase func load ()", pero en realidad no se ejecutaron en el momento del inicio de su aplicación como lo hacen los métodos de carga Objective-C +. Swift 1.2 los prohíbe para evitar la impresión de que esto podría funcionar.

Enlace: https://devforums.apple.com/message/1102025#1102025

-

tl; dr initialize() y didFinishLaunchingWithOptions parecen ser lugares decentes para tales cosas en Swift.


La load() nunca funcionó con Swift. Earier simplemente no fue llamado. Archivé un error para Apple en ese entonces (ID de error 18423731), y recientemente recibí una respuesta indicando que el problema se ha solucionado al informar explícitamente al desarrollador que esto no está permitido en Swift.

extension UIButton { // !! never called override public class func load() { // Method ''load()'' defines Objective-C class method ''load'', which is not permitted by Swift 1.2 super.load() println("not called earlier anyway"); } }

Entonces ... no. Incluso si la documentación dice lo contrario.


Lo conseguí trabajando reemplazándolo con:

override class func initialize() { }