Яка точка входу швидкого виконання коду?


105

Немає main()методу в швидкому. Програма повинна десь почати виконання. Отже, що є точкою входу швидкого виконання коду і як воно вирішено?

Відповіді:


94

Точкою входу в звичайний модуль Swift є файл у модулі, який називається main.swift. main.swift- єдиний файл, на якому дозволено мати вирази та заяви на верхньому рівні (всі інші файли Swift в модулі можуть містити лише декларації).

Cocoa Touch використовує @UIApplicationMainатрибут для реалізації, UIApplicationDelegateа не main.swiftфайл для позначення точки входу. Какао використовував мінімальний main.swiftфайл, який просто викликався NSApplicationMain, але станом на Xcode 6.1 використовує @NSApplicationMainатрибут для реалізації NSApplicationDelegate.


4
Я створив новий проект xcode і не можу main.swiftніде знайти файл. Яке розташування цього файлу?
Селвін

У програмах Cocoa та Cocoa Touch main.swiftє група підтримки файлів , яка просто налаштована на дзвінки NSApplicationMain.
Натан

4
Ні його немає в групі підтримуючих файлів. Його немає ніде в проекті.
Селвін

1
Вибачте, я помилився щодо какао-дотику, але правильний щодо какао. Дивіться мою оновлену відповідь
Натан

Звичайно, навіть у Cocoa Touch ви можете створювати та використовувати main.swift.
Султан

40

У AppDelegate.swiftфайлі ви можете побачити @UIApplicationMain.
AppDelegate - це початковий файл запису.

В основному: main.mі AppDelegate.mсвого роду об'єднуються в SwiftсправедливіAppDelegate.swift


2
@nathan Він позначив iOS8 , це стосується Cocoa-Touchмоєї відповіді.

Приємно, мені було цікаво, як я міг змінити main.m на швидкий, і я не знайшов жодної речі.
Джаліл

28

Ви можете прочитати файли та ініціалізацію

Виняток становить спеціальний файл з назвою "main.swift", який веде себе як файл ігрового майданчика, але створений з вихідним кодом програми. Файл "main.swift" може містити код верхнього рівня, а також застосовуються правила, що залежать від замовлення. Фактично, перший рядок коду, який запускається в "main.swift", неявно визначається як головна точка входу для програми. Це дозволяє мінімальній програмі Swift бути єдиним рядком - до тих пір, поки ця лінія знаходиться в "main.swift".

У Xcode шаблони Mac за замовчуванням включають файл "main.swift", але для програм iOS типовим для нових шаблонів проектів iOS є додавання @UIApplicationMain до звичайного файлу Swift. Це змушує компілятор синтезувати основну точку входу для вашої програми iOS і позбавляє від необхідності файлу «main.swift».

Крім того, ви можете зв’язатись у реалізації головного, написаного в Objective-C, поширеного при поступовому переміщенні проектів від Objective-C до Swift.


3
Я вважав, що це є кращим і вищим рівнем пояснення того, як налаштована точка входу в iOS.
Стівен

Приємна відповідь та гарне посилання. Тоді я знайшов хороше місце, щоб поставити код, який потрібно запустити "рано". Замість того, щоб використовувати один із методів делегування програми, я просто переосмислюю init на делегаті додатка, і роблю це там. Я використовував його, наприклад, щоб встановити рівень журналу за замовчуванням.
Чарльз

1

У додатках Swift є атрибути:

  • @UIApplicationMain (Какао-дотик)
  • @NSApplicationMain (Какао)

які повідомляють компілятор швидкого доступу, де знаходиться точка входу програми.

Що швидкий компілятор робить під кришкою, це те, що він створює mainфункцію, яка в основному виглядає так само, як і в додатках Objective-C, і розглядає цей метод як точку входу програми (перший метод, який викликається при запуску процесу заявки).

Якщо ви хочете прочитати більше про те, що робить швидкий компілятор з Mainатрибутами, як ОС знає, де знаходиться точка входу програми, рекомендую прочитати цю статтю: Розуміння точки входу програми для iOS


1

У Swift 5.3 є новий @mainатрибут, який дозволяє вам контролювати, де ваша точка входу у вашому проекті, а не просто main.swift. Тут може бути тільки один основний запис, і ви не можете мати main.swiftфайл та атрибут @main. Докладніші відомості див. У https://github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md .

@main
struct App {
    static func main() {
        print("Starting.")
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.