Xcode 8 beta 6:main.swift无法编译

Jas*_*ker 23 xcode program-entry-point swift swift3 xcode8-beta6

我们有一个自定义的UIApplication对象,所以我们的main.swift是

import Foundation
import UIKit

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MobileUIApplication), NSStringFromClass(AppDelegate))
Run Code Online (Sandbox Code Playgroud)

这在Xcode 8 beta 5中不起作用,所以我们使用了这个

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

在Xcode 8 beta 6上,我们使用未解析的标识符'Process'

我们需要在Xcode 8 beta 6/Swift 3中做些什么才能定义UIApplicationMain?

mat*_*att 57

我这样写:

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

要改变UIApplication类,替代NSStringFromClass(MobileUIApplication.self)nil该配方.

但是,如果您的唯一目的是将UIApplication子类替换为共享应用程序实例,则有一种更简单的方法:在Info.plist中,添加"Principal class"键并将其值设置为UIApplication子类的字符串名称,并使用@objc(...)赋予其相同Objective-C名称的属性标记您的子类的声明.

编辑此问题现在在iOS 12/Xcode 10中得到解决.CommandLine.unsafeArgv现在具有正确的签名,可以UIApplicationMain轻松调用:

UIApplicationMain(
    CommandLine.argc, CommandLine.unsafeArgv, 
    nil, NSStringFromClass(AppDelegate.self)
)
Run Code Online (Sandbox Code Playgroud)

  • 我收到此警告:'UIApplicationMain'已过时:使用UIApplicationMain的重载,其中第二个参数的类型为UnsafeMutablePointer &lt;UnsafeMutablePointer &lt;Int8&gt;?&gt;,与CommandLine.unsafeArgv的类型相同。 (3认同)
  • “ CommandLine.unsafeArgv现在具有正确的签名”可能会误导您,它具有与旧版Swift版本相同的签名。UIApplicationMain的签名已更改,并且argv参数现在与CommandLine.unsafeArgv匹配。–无论如何,很高兴已解决此问题。 (2认同)

OOP*_*Per 5

它似乎ProcessCommandLine在beta 6中重命名为。

命令行

但是的类型与CommandLine.unsafeArgv的第二个参数不匹配UIApplication,因此您可能需要编写如下内容:

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

(更新)此不匹配应视为错误。通常,您最好在发现“本不应该”的东西时发送错误报告,例如beta 5中的第三个参数。我希望这个“错误”会尽快得到解决。


如果只想指定自定义UIApplication类,为什么不使用Info.plist?

NSPrincipalClass | String | $(PRODUCT_MODULE_NAME).MobileUIApplication
Run Code Online (Sandbox Code Playgroud)

(在“原始键/值”视图中显示为“主体类”。)

在Info.plist中,您可以使用MobileUIApplication正常方式使用@UIApplicationMain

(添加)标头文档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.
Run Code Online (Sandbox Code Playgroud)