programacion - swift lenguaje
Xcode 8 beta 6: main.swift no se compilará (2)
Tenemos un objeto UIApplication personalizado, por lo que nuestro main.swift era
import Foundation
import UIKit
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate))
y eso no funcionó en Xcode 8 beta 5, así que usamos esto
//TODO Swift 3 workaround? https://forums.developer.apple.com/thread/46405
UIApplicationMain( Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self))
En Xcode 8 beta 6 obtenemos el uso del identificador no resuelto ''Proceso''
¿Qué necesitamos hacer en Xcode 8 beta 6 / Swift 3 para definir el UIApplicationMain?
Lo escribo de esta manera:
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
Para cambiar la clase de UIApplication, sustituya NSStringFromClass(MobileUIApplication.self)
por nil
en esa formulación.
Sin embargo, si su único propósito aquí es sustituir una subclase de UIApplication como la instancia de aplicación compartida, hay una forma más sencilla: en la lista de información , agregue la clave "Clase principal" y establezca su valor al nombre de cadena de su subclase de UIApplication, y marque su declaración de esa subclase con un @objc(...)
dándole el mismo nombre de Objective-C.
EDITAR Este problema ahora se resuelve en iOS 12 / Xcode 10. CommandLine.unsafeArgv
ahora tiene la firma correcta, y uno puede llamar a UIApplicationMain
fácilmente:
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
nil, NSStringFromClass(AppDelegate.self)
)
Parece que Process
ha sido renombrado a CommandLine
en beta 6.
Pero el tipo de CommandLine.unsafeArgv
no coincide con el segundo argumento de UIApplication
, por lo que es posible que deba escribir algo como esto:
CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in
_ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self))
}
(ACTUALIZACIÓN) Este desajuste debe considerarse como un error. En general, es mejor que envíes un informe de error cuando encuentres cosas de "esto no debería ser", como el tercer parámetro en la beta 5. Espero que este "error" se solucione pronto.
Si solo desea designar su clase de aplicación UIA personalizada, ¿por qué no usa Info.plist?
NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication
(Se muestra como "Clase principal" en la vista de Claves / Valores no-Raw).
Con esto en su lista de información, puede usar su aplicación MobileUIApplication
manera normal usando @UIApplicationMain
.
( UIApplicationMain
) Encabezado doc de UIApplicationMain
:
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no // NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.