如何告诉 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
)。所以它应该推断类型并且与旧类型没有逻辑差异。因此,请保持冷静,让它推断 ;)
我想实例化我创建的 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
)。所以它应该推断类型并且与旧类型没有逻辑差异。因此,请保持冷静,让它推断 ;)