Что означает «@UIApplicationMain»?

82

Я только что создал свой первый проект Swift, в AppDelegate.swiftнем есть строка над объявлением класса - почему он там ?!

...
import UIKit
import CoreData

@UIApplicationMain // <- WHY IS IT HERE?
class AppDelegate: UIResponder, UIApplicationDelegate {
... 
Янош
источник

Ответы:

135

@UIApplicationMainАтрибут Swift заменяет тривиальный main.mфайл , найденный в проектах Objective-C (чья цель состоит в том, чтобы реализовать mainфункцию , что это точка входа для всех программ C и вызоваUIApplicationMain для начала цикла выполнения Cocoa Touch и приложение инфраструктуры).

В Objective-C основной (хех) бит конфигурации для каждого приложения, который UIApplicationMainпредоставляет функция, - это назначение одного из настраиваемых классов вашего приложения в качестве делегата общего UIApplicationобъекта. В Swift, вы можете легко назначить этот класс, добавляя в @UIApplicationMainатрибут к этому классу декларации. (Вы также можете вызвать UIApplicationMainфункцию напрямую, если у вас есть причина. В Swift вы помещаете этот вызов в код верхнего уровня в main.swiftфайле.)

@UIApplicationMainтолько для iOS. В OS X делегат приложения традиционно устанавливается в главном файле пера, обозначенном Info.plist (то же самое для Swift, что и для ObjC), но в раскадровках OS X нет главного файла пера, поэтому @NSApplicationMainтам то же самое.

рикстер
источник
1
На странице 58 в The Swift Programming Language я нашел раздел Атрибуты интересным.
János
1
Я бы процитировал документы в своем ответе, но, похоже, для этого атрибута пока нет. Атрибуты страницы , которую вы нашли, где вы , вероятно , будет его найти.
rickster 01
3
Описание для UIApplicationMainсейчас есть. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Куинн Тейлор
2
Повторите свое последнее предложение, обратите внимание, что в OS X есть эквивалент @NSApplicationMain
Bill
@UIApplicationMain также для tvOS
Shaked Sayag
7

Атрибут @UIApplicationMain заменяет файл main.m & и точку входа для запуска вашего приложения.

Еще одна вещь, которую ваша программа может работать без этого @UIApplicationMain, все, что вам нужно сделать, это прокомментировать // @ UIApplicationMain` создать main.swift так же, как main.m в объекте c, и написать код ниже. это будет точка входа в ваше приложение

import Foundation
class FLApplication: UIApplication
{
    override func sendEvent(event: UIEvent!)
    {
        println("Entry Point") // this is an example
    }
}
Приянка
источник
1
Если я это сделаю, он компилируется и запускается, но завершается после установки приложения, и sendEvent никогда не вызывается. И что? :)
StuFF mc
Подробнее здесь: stackoverflow.com/questions/24020000/… - но опять же я не попадаю в sendEvent ...
StuFF mc
@StuFFmc благодарю за эту информацию. Метод sendEvent у меня тоже не вызывается.
dellos 04
2
FoundationИмпорта, то FLApplicationслучайные подклассы без объявления какой - либо помощи подкласса ... Извините, но ни один из этого ответа не имеют смысл первого предложение , за исключение.
эфемер
7

AppDelegate.swift исходный файл имеет две основные функции:

  • Он создает точку входа в ваше приложение и цикл выполнения, который доставляет события ввода в ваше приложение. Эта работа выполняется атрибутом UIApplicationMain (@UIApplicationMain) , который отображается в верхней части файла. UIApplicationMain создает объект приложения, который отвечает за управление жизненным циклом приложения и объект делегата приложения.

  • Он определяет класс AppDelegate , схему объекта делегата приложения. Делегат приложения создает окно, в котором отображается содержимое вашего приложения, и предоставляет место для ответа на переходы между состояниями в приложении. Класс AppDelegate - это место, где вы пишете свой собственный код на уровне приложения.

Таринду
источник
Привет @Manju ....... Я переопределил свой основной UIApplication как TimerUiApplication ............. У меня есть переменная .......... Как мне изменить эту переменную моего UIApplication от моего UIViewController .....................
пресыщать
3

Теперь, когда документация Swift обновлена, вот соответствующий отрывок:

NSApplicationMain

Примените этот атрибут к классу, чтобы указать, что это делегат приложения. Использование этого атрибута эквивалентно вызову NSApplicationMain ( : :) и передаче имени этого класса в качестве имени класса делегата.

Если вы не используете этот атрибут, предоставьте файл main.swift с функцией main (), которая вызывает функцию NSApplicationMain ( : :). Например, если ваше приложение использует настраиваемый подкласс NSApplication в качестве основного класса, вызовите функцию NSApplicationMain вместо использования этого атрибута.

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

Уильям Энтрикен
источник
0

@UIApplicationMain - это атрибут, применяемый к описанному ниже классу AppDelegate , чтобы предоставить дополнительную информацию об этом классе.

В этом случае атрибут @UIApplicationMain указывает, что класс AppDelegate является делегатом вашего приложения.

ERN
источник
0

UIApplicationMain Примените этот атрибут к классу, чтобы указать, что это делегат приложения. Использование этого атрибута эквивалентно вызову функции UIApplicationMain и передаче имени этого класса в качестве имени класса делегата. (Источник)

michaelI
источник