SwiftによるUIApplicationのサブクラス化


91

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

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

しかし、ガイドは言うので、迅速にはmain.mファイルはありません

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

では、UIApplicationを迅速にサブクラス化する方法は?なにか提案を?


1
app-info.plistでUIApplicationMain()クラス名を追加するよりも、パラメーターを変更するほうが望ましいのはなぜNSPrincipalClassですか?
Andreas

回答:


172

NOTE構文は2019年6月にはXCode 10.1スウィフト5用に更新されましたが(にクレジットここではマットの答え && ここ桐ファムの答えは、あなたが以前の構文を探している場合)、編集セクションを見てください。

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

まず、AppDelegate.swiftファイルの上部に次の行があることに気付きました。

@UIApplicationMain

この行はスコープの外(ファイルレベルにある)なので、すぐに実行され、コンパイラーが標準のメイン関数に変換すると想定しています。

そこで、新しい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は正しくサブクラス化されており、ログに「イベントの送信」メッセージが表示されます


OLD EDITS
参考までに、これはバージョン1からバージョン3に大きく変更されたため、以前の編集はすべてここに残します。


編集-2015年3月

Hu UIApplicationMainJunfengのコメントによると、main.swiftファイルに関する説明は、The Swift Language Reference:Linkの「Attributes」セクションに記載されています。

Thomas Verbeekによるコメントとして、XCode 6.3 Betaでは、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)
)

AppDelegate.swiftファイルで直接UIApplicationMain()を呼び出すことができるかどうかを理解しようとしています。このメソッドの「Swiftバージョン」があるようですが、コンパイラエラーが発生するため、いくつかのテストを行います「
Swift

信じられないほどクール。sendEvent:今日のオーバーライドのユースケースが何であるか知りたいです(iOS 3で実行する必要があったことを覚えています...)
matt

2
誰かが知りたい場合、UIApplicationMainおよびmain.swiftThe Swift Language ReferenceのAttributesセクションに記載されている場合。developer.apple.com/library/ios/documentation/Swift/Conceptual/...
hujunfeng

ヒントをありがとう、Swiftマニュアルの最初のリリースではドキュメントに記載されていなかったと99%確信しています。しかし、情報を追加して回答を更新します。
LombaX 2015年

5
すばらしい答えです。XCodeの6.3ベータ版では、あなたはそれを見つけるかもしれないC_ARGCC_ARGVという名前に変更されているProcess.argcProcess.unsafeArgv、それぞれ。main.swiftファイル内のUIApplicationMain呼び出しを次のように更新する必要がありますUIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(KBApplication), NSStringFromClass(AppDelegate))
Thomas Verbeek

4

1つの代替方法はUIApplication、サブクラス化する代わりに拡張することです。AppleからリリースされたiBookによると、Swiftの拡張機能は次のことができます。

計算プロパティと計算静的プロパティを追加するインスタンスメソッドと型メソッドを定義する新しい初期化子を提供する添え字を定義する入れ子になった新しい型を定義して使用する既存の型をプロトコルに準拠させる

抜粋:Apple Inc.「The Swift Programming Language。

UIApplicationこれらの機能によってサブクラス化のニーズが満たされている場合は、拡張機能が適しています。


5
いいアドバイス-imhoに答えない:)
Daij-Djan

1
  1. のサブクラスを作成し、UIApplicationロジックを追加します

    import UIKit
    
    class CustomUIApplication: UIApplication {
        override func sendEvent(_ event: UIEvent) {
            super.sendEvent(event)
        }
    }
  2. OSから呼び出されるアプリケーションの新しいエントリポイントで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 {
        //...
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.