Подкласс UIApplication с Swift
В Objective C это было просто: достаточно было обновить файл main.m и изменить параметры UIApplicationMain()
return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));
Но в swift нет файла main.m, так как руководство говорит
"Код, написанный в глобальной области видимости, используется в качестве точки входа в программу, поэтому вам не нужна основная функция".
Итак, как создать подкласс UIApplication в Swift? Любое предложение?
2 ответа
Хорошо, я нашел решение Во-первых, я заметил, что в верхней части файла AppDelegate.swift есть эта строка
@UIApplicationMain
Так как эта строка находится вне какой-либо области (она находится на уровне файла), она выполняется немедленно, и я предполагаю, что компилятор переведет ее в стандартную основную функцию.
Итак, я сделал это, начиная с нового приложения Swift-Only:
- закомментирован
@UIApplicationMain
- добавил файл main.swift, как этот (FLApplication мой подкласс).
ВАЖНО, файл ДОЛЖЕН БЫТЬ НАЗВАН main.swift, так как операторы верхнего уровня не поддерживаются другими файлами! Вы не можете добавить вызов UIApplicationMain() в любой другой файл, иначе вы получите эту ошибку:
Выражения не допускаются на верхнем уровне
Это файл main.swift
ПРИМЕЧАНИЕ. Синтаксис обновлен для XCode 10 в СЕНТЯБРЕ 2018 г. - здесь можно найти ответ на ответ Мэтта, если вы ищете предыдущие синтаксисы, посмотрите раздел редактирования.
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
nil, NSStringFromClass(AppDelegate.self)
)
Затем создайте файл swift для подкласса UIApplication, FLApplication.swift, с этим кодом:
import UIKit
import Foundation
class FLApplication: UIApplication
{
override func sendEvent(event: UIEvent!)
{
super.sendEvent(event)
println("send event") // this is an example
// ... dispatch the message...
}
}
Теперь UIApplication правильно разделен на подклассы, и вы увидите сообщения "send event" в журнале
СТАРЫЕ РЕДАКТЫ
Для справки, так как это сильно изменилось с версии 1 до версии 3, я оставляю здесь все предыдущие изменения
РЕДАКТИРОВАТЬ - МАРТ 2015
Как прокомментировал Ху Цзюньфэн сейчас объяснения о UIApplicationMain
и файл main.swift описаны в разделе "Атрибуты" справочника по языку Swift: ссылка
Как прокомментировал Томас Вербик В бета-версии XCode 6.3 вы можете обнаружить, что C_ARGC и C_ARGV были переименованы в Process.argc и Process.unsafeArgv соответственно. Ваш вызов UIApplicationMain в файле main.swift необходимо обновить до:
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
Синтаксис до XCode 8 был
import Foundation
import UIKit
UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
РЕДАКТИРОВАТЬ - ДЕКАБРЬ 2016
Решение для Xcode 8, до бета 6
import Foundation
import UIKit
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(FLApplication.self),
NSStringFromClass(AppDelegate.self)
)
Одним из вариантов является расширение UIApplication
вместо того, чтобы разделить его на подклассы. Согласно iBook, выпущенному Apple, расширения в Swift могут:
Добавить вычисляемые свойства и вычисленные статические свойства. Определить методы экземпляров и методы типов. Предоставить новые инициализаторы. Определить индексы. Определить и использовать новые вложенные типы. Привести существующий тип в соответствие с протоколом.
Отрывок из: Apple Inc. "Язык программирования Swift.
Если ваши потребности в подклассе UIApplication
удовлетворены этими возможностями, расширение может быть путь.
Создайте подкласс
UIApplication
и добавьте свою логикуimport UIKit class CustomUIApplication: UIApplication { override func sendEvent(_ event: UIEvent) { super.sendEvent(event) } }
Создать
main.swift
файл, который вызываетUIApplicationMain()
глобальная функция [About], которая представляет собой новую точку входа вашего приложения, вызываемую ОС. Эта функция получает аргумент от вызываемой функции,UIApplication
название класса,UIApplicationDelegate
имя класса и запускает основной цикл выполнения.import UIKit UIApplicationMain( CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(CustomUIApplication.self), //was created at step 1 NSStringFromClass(AppDelegate.self) )
Удалить / прокомментировать
@UIApplicationMain
аннотация по умолчаниюAppDelegate
.@UIApplicationMain
генерируетmain.swift
.Если вы этого не сделаете, вы получите ошибку компиляции:
UIApplicationMain
атрибут не может использоваться в модуле, который содержит код верхнего уровня//@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { //... }