web-dev-qa-db-ja.com

application(_:didFinishLaunchingWithOptions :) 'はオプションの要件にほぼ一致します

Xcode 8ベータ6をインストールした後、次のような警告が表示されます。

インスタンスメソッド「application(_:didFinishLaunchingWithOptions :)」は、プロトコル「UIApplicationDelegate」のオプション要件「application(_:didFinishLaunchingWithOptions :)」にほぼ一致します。

私のアプリデリゲートで。

警告を消すために推奨される2つの修正があります。

  1. メソッドをプライベートとしてマークする
  2. メソッドに@nonobjcを追加します

どちらかを行うと、警告が沈黙します。しかし、なぜこれを行う必要があるのでしょうか?

27
doraemon

iOS 12 SDKアップデート

IOS 12 SDK(Xcode 10に同梱)では、UIApplicationLaunchOptionsKey名前が変更されました がネストされたタイプUIApplication.LaunchOptionsKeyになります。

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    // ...
}

iOS 10および11 SDK(Xcode 8および9)

この警告は、 application(_:didFinishLaunchingWithOptions:) デリゲートメソッドのdidFinishLaunchingWithOptions:パラメーターがSwiftとしてではなく、[UIApplicationLaunchOptionsKey: Any]?としてブリッジされる]という事実に起因します。 [NSObject : AnyObject]?

したがって、この変更を反映するには実装を更新する必要があります。

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
) -> Bool {
    // ...
}

Xcodeの提案された修正はどちらも実際に問題を修正しないことに注意してください。Objective-Cからapplication(_:didFinishLaunchingWithOptions:)の実装を隠すだけです。つまり、実際に呼び出されることはありません。

51
Hamish

関数に渡される最初のパラメーターには外部名がありません。このメソッドを直接呼び出さないので、これは実際にはほんのわずかな詳細であり、コンパイラを満足させるための簡単な修正です。最初のパラメーター名を_に手動で編集するか、Xcodeにこれを処理させることができます。

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool  

または新しい構文

func application(_ application:UIApplication, 
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool // or remove = nil and try

最新のドキュメントは Apple から入手でき、サンプルリンクは here で入手できます。

3
Anbu.Karthik