Подкласс 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 удовлетворены этими возможностями, расширение может быть путь.

  1. Создайте подкласс UIApplication и добавьте свою логику

    import UIKit
    
    class CustomUIApplication: UIApplication {
        override func sendEvent(_ event: UIEvent) {
            super.sendEvent(event)
        }
    }
    
  2. Создать main.swift файл, который вызывает UIApplicationMain()глобальная функция [About], которая представляет собой новую точку входа вашего приложения, вызываемую ОС. Эта функция получает аргумент от вызываемой функции,UIApplication название класса, UIApplicationDelegate имя класса и запускает основной цикл выполнения.

    import UIKit
    
    UIApplicationMain(
        CommandLine.argc,
        CommandLine.unsafeArgv,
    
        NSStringFromClass(CustomUIApplication.self), //was created at step 1
        NSStringFromClass(AppDelegate.self)
    )
    
  3. Удалить / прокомментировать @UIApplicationMain аннотация по умолчанию AppDelegate.

    @UIApplicationMain генерирует main.swift.

    Если вы этого не сделаете, вы получите ошибку компиляции:

    UIApplicationMain атрибут не может использоваться в модуле, который содержит код верхнего уровня

    //@UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        //...
    }
    
Другие вопросы по тегам