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

问题描述

我想实例化我创建的情节提要的根视图控制器。

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

问题是,自iOS13起,有一个新方法签名采用了新的可选参数:(creator: ((NSCoder)->ViewController?)?)

Capture of Xcode showing autocompletion

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

Capture of Xcode showing an inline error prompt

即使进行了版本检查,我也无法解决它。

Capture of Xcode still showing an error after applying a suggested fix

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

解决方法

您的问题的快速解答:Xcode错误

首先,如您的屏幕快照所示,这是一个错误。 (尝试删除驱动数据或重新启动内容以使其正常工作)。以下是您问题的答案。


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

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

class ViewController { }
class UIViewController { }

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

因此称此为 instantiateInitialViewController() 的含糊用法:

let theController = instantiateInitialViewController()

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

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

新的instantiateInitialViewController返回类型是约束为ViewController的协议(UIViewController)。因此,它应该推断类型,并且与旧类型没有逻辑差异。因此,请保持冷静,并让其推断出;)

,

好吧,这显然是Xcode的一个错误。

重新启动Mac后,它可以正常工作。

我为什么认为错误可能来自我……?️

谢谢大家!

,

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

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

UIViewController对象可以保存到磁盘并根据请求进行恢复(例如,电池电量不足,内存警告问题)。

新的iOS13方法

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

允许视图控制器实例通过恢复其某些状态而栩栩如生。

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

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

    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...