1. ホーム
  2. ios

[解決済み] SwiftでUIApplicationをサブクラス化する

2023-03-02 20:18:56

質問

Objective C では、main.m ファイルを更新し、UIApplicationMain() のパラメータを変更するだけで十分でした。

return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));

しかし、swiftではmain.mファイルがありません。ガイドによると

"グローバルスコープで書かれたコードはプログラムのエントリポイントとして使用されるため、main関数は必要ありません。"

では、swiftでUIApplicationをサブクラス化するにはどうすればいいのでしょうか?何か提案はありますか?

どのように解決するのですか?

<ブロッククオート

注意 は、2019年6月のXCode 10.1およびSwift 5向けに構文が更新されました ( クレジットで mattの回答はこちら &&です。 Tung Fam さんの回答はこちら ) 、もし以前の構文をお探しなら、編集セクションをご覧ください。

OK、私は解決策を見つけました

まず、AppDelegate.swiftファイルの先頭に、次のような行があることに気がつきました。

@UIApplicationMain

この行はスコープの外(ファイルレベル)にあるので、すぐに実行され、コンパイラは標準的なmain関数でこれを翻訳したと推測されます。

そこで、新しいSwift-Onlyのアプリケーションから始めて、これを実行しました。

  • コメントアウトされた @UIApplicationMain
  • のようにmain.swiftを追加しました(FLApplicationは私のサブクラスです)。

    重要 トップレベルステートメントは他のファイルではサポートされていないので、ファイルは main.swift という名前でなければなりません! UIApplicationMain()コールを他のファイル内に追加することはできません。そうでなければ、このエラーが発生します。

トップレベルでは式は許可されません

これがmain.swiftのファイルです。

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)

次に、このコードでUIApplicationのサブクラスFLApplication.swiftのswiftファイルを作成します。

import UIKit
import Foundation

class FLApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        print("send event")
    }
}

これで、UIApplicationは正しくサブクラス化され、ログに"send event"のメッセージが表示されるようになりました。


旧版の編集

参考までに、バージョン1とバージョン3ではかなり変更されているので、以前の編集をすべてここに残しておきます。


編集 - 2015年3月

Hu Junfeng氏によってコメントされたように、現在、説明の中にある UIApplicationMain と main.swift ファイルについての説明は、The Swift Language Reference の Attributes セクションに記載されています。 リンク

Thomas Verbeek によってコメントされたように XCode 6.3 ベータでは、C_ARGC と C_ARGV がそれぞれ Process.argc と Process.unsafeArgv に名前が変更されたことが分かるかもしれません。main.swiftファイル内のUIApplicationMainの呼び出しは、更新が必要です。

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年12月

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)
)