¿Qué significa "@UIApplicationMain"?

82

Acabo de crear mi primer proyecto Swift, en el AppDelegate.swifthay una línea encima de una declaración de clase, ¿por qué está ahí?

...
import UIKit
import CoreData

@UIApplicationMain // <- WHY IS IT HERE?
class AppDelegate: UIResponder, UIApplicationDelegate {
... 
János
fuente

Respuestas:

134

El @UIApplicationMainatributo en Swift reemplaza el main.marchivo trivial que se encuentra en los proyectos de Objective-C (cuyo propósito es implementar la mainfunción que es el punto de entrada para todos los programas en C y llamar UIApplicationMainpara iniciar el ciclo de ejecución de Cocoa Touch y la infraestructura de la aplicación).

En Objective-C, la parte principal (je) de la configuración por aplicación que UIApplicationMainproporciona la función es designar una de las clases personalizadas de su aplicación como delegada del UIApplicationobjeto compartido . En Swift, puede designar fácilmente esta clase agregando el @UIApplicationMainatributo a la declaración de esa clase. (También puede invocar la UIApplicationMainfunción directamente si tiene motivos para hacerlo. En Swift, coloca esa llamada en un código de nivel superior en un main.swiftarchivo).

@UIApplicationMaines solo para iOS. En OS X, el delegado de la aplicación se establece tradicionalmente en el archivo nib principal designado por Info.plist (lo mismo para Swift que para ObjC), pero con los guiones gráficos de OS X no hay un archivo nib principal, por lo que @NSApplicationMainhace lo mismo allí.

rickster
fuente
1
En la página 58 de El lenguaje de programación Swift, encontré la sección Atributos interesante.
János
1
Habría citado los documentos en mi respuesta, pero todavía no parece haber ninguno para este atributo. La Atributos página has encontrado es donde probablemente sería encontrarlo.
rickster
3
Hay una descripción para UIApplicationMainahora. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Quinn Taylor
2
Re su última oración, tenga en cuenta que OS X tiene el equivalente @NSApplicationMain
Proyecto de ley
@UIApplicationMain también es para tvOS
Shaked Sayag
7

El atributo @UIApplicationMain es un reemplazo del archivo main.m y el punto de entrada para que se inicie la aplicación.

Una cosa más que su programa puede funcionar sin esta @UIApplicationMain, todo lo que necesita hacer es comentar // @ UIApplicationMain` crear main.swift igual que main.m en el objetivo cy escribir el código a continuación. ese será el punto de entrada de su aplicación

import Foundation
class FLApplication: UIApplication
{
    override func sendEvent(event: UIEvent!)
    {
        println("Entry Point") // this is an example
    }
}
Priyanka
fuente
1
Si hago eso, se compila y se ejecuta, pero termina después de instalar la aplicación y nunca se llama a sendEvent. ¿Y qué? :)
Cosas mc
Más información aquí: stackoverflow.com/questions/24020000/… - pero nuevamente no aterrizo en sendEvent ...
StuFF mc
@StuFFmc gracias por esta información. El método sendEvent no me llamó también.
dellos
2
La Foundationimportación, la FLApplicationsubclase aleatoria sin declarar ningún uso de la subclase ... Lo siento, pero ninguna de estas respuestas tiene sentido excepto la primera oración.
ephemer
7

El archivo fuente AppDelegate.swift tiene dos funciones principales:

  • Crea el punto de entrada a su aplicación y un ciclo de ejecución que entrega eventos de entrada a su aplicación. Este trabajo lo realiza el atributo UIApplicationMain (@UIApplicationMain) , que aparece en la parte superior del archivo. UIApplicationMain crea un objeto de aplicación que es responsable de administrar el ciclo de vida de la aplicación y un objeto delegado de la aplicación.

  • Define el clase AppDelegate , el modelo del objeto delegado de la aplicación. El delegado de la aplicación crea la ventana donde se dibuja el contenido de su aplicación y proporciona un lugar para responder a las transiciones de estado dentro de la aplicación. La clase AppDelegate es donde escribe su código personalizado a nivel de aplicación.

Tharindu
fuente
Hola @Manju ....... He anulado mi UIApplication principal como TimerUiApplication ............. Tengo una variable en ella .......... modificar esa variable de mi UIApplication de mi uiViewController .....................
Cloy
3

Ahora que la documentación de Swift está actualizada, aquí está el pasaje relevante:

Aplicación NSAPrincipal

Aplique este atributo a una clase para indicar que es el delegado de la aplicación. El uso de este atributo equivale a llamar a NSApplicationMain ( : :) y pasar el nombre de esta clase como el nombre de la clase delegada.

Si no usa este atributo, proporcione un archivo main.swift con una función main () que llame a la función NSApplicationMain ( : :). Por ejemplo, si su aplicación usa una subclase personalizada de NSApplication como su clase principal, llame a la función NSApplicationMain en lugar de usar este atributo.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html

William Entriken
fuente
0

@UIApplicationMain es un atributo aplicado a la clase -declarada a continuación- AppDelegate , para proporcionar más información sobre esta clase.

En este caso, el atributo @UIApplicationMain indica que la clase AppDelegate es la aplicación delegada de su aplicación.

ERN
fuente
0

UIApplicationMain Aplique este atributo a una clase para indicar que es el delegado de la aplicación. El uso de este atributo equivale a llamar a la función UIApplicationMain y pasar el nombre de esta clase como el nombre de la clase delegada. (Fuente)

MichaelI
fuente