web-dev-qa-db-ja.com

Xcode 8ベータ6:main.Swiftがコンパイルされない

カスタムUIApplicationオブジェクトがあるので、main.Swiftは

import Foundation
import UIKit

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate))

xcode 8ベータ5では機能しなかったので、これを使用しました

//TODO Swift 3 workaround? https://forums.developer.Apple.com/thread/46405
UIApplicationMain( Process.argc, UnsafeMutablePointer<UnsafeMutablePointer<CChar>>(Process.unsafeArgv), nil, NSStringFromClass(AppDelegate.self))

Xcode 8ベータ6では未解決の識別子「Process」の使用を取得します

Xcode 8ベータ6/Swift 3でUIApplicationMainを定義するために何をする必要がありますか?

23
Jason Hocker

私はこのように書きます:

UIApplicationMain(
    CommandLine.argc,
    UnsafeMutableRawPointer(CommandLine.unsafeArgv)
        .bindMemory(
            to: UnsafeMutablePointer<Int8>.self,
            capacity: Int(CommandLine.argc)),
    nil,
    NSStringFromClass(AppDelegate.self)
)

UIApplicationクラスを変更するには、その公式のnilNSStringFromClass(MobileUIApplication.self)に置き換えます。

ただし、ここでのonly目的が共有アプリケーションインスタンスとしてUIApplicationサブクラスを置き換えることである場合、より簡単な方法があります:Info.plist、「プリンシパルクラス」キーを追加し、その値をUIApplicationサブクラスの文字列名に設定し、そのサブクラスの宣言に@objc(...)属性に同じObjective-C名を付けます。

[〜#〜] edit [〜#〜]この問題はSwift 4.2。で解決されました。CommandLine.unsafeArgvに正しい署名が追加されました。 UIApplicationMainを簡単に呼び出す:

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    nil, NSStringFromClass(AppDelegate.self)
)
57
matt

ベータ版6ではProcessCommandLineに名前が変更されたようです。

コマンドライン

ただし、CommandLine.unsafeArgvのタイプがUIApplicationの2番目の引数と一致しないため、次のように記述する必要がある場合があります。

CommandLine.unsafeArgv.withMemoryRebound(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)) {argv in
    _ = UIApplicationMain(CommandLine.argc, argv, NSStringFromClass(MobileUIApplication.self), NSStringFromClass(AppDelegate.self))
}

(更新)この不一致はバグと見なされます。一般に、ベータ5の3番目のパラメーターのように、「これはすべきでない」ことが判明した場合は バグレポート を送信することをお勧めします。この「バグ」がすぐに修正されることを願っています。


カスタムUIApplicationクラスを指定するだけの場合は、Info.plistを使用してみませんか?

NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication

(Raw Keys/Values以外のビューでは「プリンシパルクラス」として表示されます。)

これをInfo.plistで使用すると、@UIApplicationMainを使用して通常の方法でMobileUIApplicationを使用できます。

(追加)UIApplicationMainのヘッダードキュメント:

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
5
OOPer