如何告诉 Swift 在默认选项之间使用哪个函数签名

How to tell Swift which function signature to use between default optionals

我想实例化我创建的 Storyboard 的根视图控制器。

为此,我习惯于从情节提要中调用 -instantiateInitialViewController()

事情是因为 iOS13 有一个新的方法签名,它接受一个新的可选参数:(creator: ((NSCoder)->ViewController?)?)

烦人的是 Xcode 认为我想使用那个新的 API,这使得我的应用程序与旧的 OS 不兼容。

我无法绕过它,即使进行了版本检查。

我的问题是:如何告诉编译器使用没有参数的方法签名?

实际上,我不知道您问题的答案,但也许您只是想从低于 13.0 的 iOS 版本的 Storyboard 初始化您的 ViewController?试试这个:

UIStoryboard(name: "storyboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerID")

好的,这显然是 Xcode 的错误。

重新启动我的 mac 后,它工作正常。

为什么我认为错误可能来自我...... ‍♀️

谢谢大家!

UIViewController 对象可以保存到磁盘并根据请求恢复(即,电池电量耗尽、内存警告问题)。

新的iOS13方法

instantiateInitialViewController { (coder:NSCoder) -> MyViewController? in
    return MyViewController(coder: coder)
}

允许视图控制器实例通过恢复它的一些状态来激活。

此方法调用在 MyViewController 中调用 initWith(coder:),在此示例中,可以在其中恢复“name”属性。

class MyViewController: UIViewController {
      
    var name:String?
    
    required init?(coder: NSCoder) {
        name = coder.decodeObject(forKey: "name") as? String
        super.init(coder: coder)
    }   
}

    

快速解答您的问题:Xcode BUG

首先,正如您的屏幕截图所示,这是一个错误。 (尝试删除驱动数据或重新启动东西以使其工作)。以下是对您问题的回答。


说明:如何告诉编译器使用哪个方法签名

Swift 根据表达式中使用的类型推断函数签名。想象一下:

class ViewController { }
class UIViewController { }

func instantiateInitialViewController() -> UIViewController? {}
func instantiateInitialViewController() -> ViewController? {}

所以调用它会是 instantiateInitialViewController() 的不明确使用:

let theController = instantiateInitialViewController()

解决方案是明确告诉编译器期望的类型是什么:

let theController: ViewController? = instantiateInitialViewController()
let theOtherController: UIViewController? = instantiateInitialViewController()

新的 instantiateInitialViewController return 类型是一种限制为 UIViewController 的协议 (ViewController)。所以它应该推断类型并且与旧类型没有逻辑差异。因此,请保持冷静,让它推断 ;)