Какая точка входа в быстрое выполнение кода?

106

В main()быстром не существует метода. Программа должна откуда-то начинать выполнение. Итак, какова точка входа в быстрое выполнение кода и как это решается?

Селвин
источник

Ответы:

94

Точкой входа в простой модуль Swift является файл в вызываемом модуле main.swift. main.swift- единственный файл, которому разрешено иметь выражения и инструкции на верхнем уровне (все другие файлы Swift в модуле могут содержать только объявления).

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

Натан
источник
4
Я создал новый проект xcode и main.swiftнигде не могу найти файл. Где находится этот файл?
Selvin
В приложениях Cocoa и Cocoa Touch main.swiftнаходится в группе Supporting Files и просто настроен для вызова NSApplicationMain.
Натан 08
4
Нет, его нет в группе вспомогательных файлов. Его нет в проекте.
Селвин
1
Извините, я ошибся насчет Cocoa Touch, но поправил какао. См. Мой обновленный ответ
Натан
Конечно, даже в Cocoa Touch можно создавать и использовать main.swift.
Sulthan
39

В AppDelegate.swiftфайле вы можете увидеть @UIApplicationMain.
AppDelegate - это файл исходной записи.

В основном: main.mи AppDelegate.mбудут своего рода объединены в SwiftтолькоAppDelegate.swift


источник
2
@nathan Он отметил iOS8 , это верноCocoa-Touch , мой ответ правильный.
Хорошо, мне было интересно, как я могу изменить main.m на swift, но я не нашел ни одной вещи.
Джалил
28

Вы можете прочитать файлы и инициализация

Исключением является специальный файл с именем «main.swift», который ведет себя так же, как файл игровой площадки, но создается с использованием исходного кода вашего приложения. Файл «main.swift» может содержать код верхнего уровня, также применяются правила, зависящие от порядка. Фактически, первая строка кода для запуска в main.swift неявно определяется как основная точка входа для программы. Это позволяет минимальной программе Swift быть одной строкой, если эта строка находится в main.swift.

В Xcode шаблоны Mac по умолчанию включают файл «main.swift», но для приложений iOS по умолчанию для новых шаблонов проектов iOS добавляется @UIApplicationMain в обычный файл Swift. Это заставляет компилятор синтезировать основную точку входа для вашего приложения iOS и устраняет необходимость в файле «main.swift».

В качестве альтернативы вы можете добавить ссылку на реализацию main, написанную на Objective-C, что часто бывает при постепенном переносе проектов с Objective-C на Swift.

onmyway133
источник
3
Я обнаружил, что это более качественное и более подробное объяснение того, как точка входа настроена в iOS.
Стивен
Хороший ответ и хорошая ссылка. Затем я нашел хорошее место для размещения кода, который должен запускаться «раньше». Вместо того, чтобы использовать один из методов делегата приложения, я просто переопределяю init в делегате приложения и делаю это там. Я использовал его, например, для настройки уровня ведения журнала по умолчанию.
Чарльз
1

В приложениях Swift есть атрибуты:

  • @UIApplicationMain (Прикосновение какао)
  • @NSApplicationMain (Какао)

которые сообщают быстрому компилятору, где находится точка входа в приложение.

Что делает компилятор swift под капотом, так это то, что он создает mainфункцию, которая в основном выглядит так же, как в приложениях Objective-C, и рассматривает этот метод как точку входа приложения (первый метод, который вызывается при запуске процесса приложения).

Если вы хотите узнать больше о том, что делает компилятор Swift с 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.")
    }
}
Possen
источник