tutorial programacion lenguaje español curso apple swift xcode main swift3 xcode8-beta6

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.

CommandLine

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.