我有条件转换的奇怪行为,应用程序没有问题,但我试图理解为什么会发生这种情况。问题是当我尝试在sender:
performSegue
参数中传递元组时。
我的Navigation Controller
为Storyboard Entry Point
。在某些情况下,当我放松到root view controller
时,我会从segue
以编程方式执行Navigation Controller
,这看起来像这样:
@IBAction func unwindSegue(segue: UIStoryboardSegue) {
DispatchQueue.main.async {
self.navigationController?.performSegue(withIdentifier: "someSegue",
sender: ("Hello", "World"))
}
}
现在,在我的Navigation Controller
中,我希望segue
像这样:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "someSegue" {
if let someViewController = segue.destination as? SomeViewController,
let tuple = sender as? (String,String) {
someViewController.navigationItem.title = tuple.0 + " " + tuple.1
}
}
}
问题在于,这不起作用,我必须在我的unwindSegue
中进行条件转换:
self.navigationController?.performSegue(withIdentifier: "someSegue",
sender: ("Hello", "World") as? (String,String))
当然编译器会发出警告:
Conditional cast from '(String, String)' to '(String, String)' always succeeds
为什么会这样?我的prepare(for segue:,sender:)
中的let绑定是否足够?如果发件人无论如何都以unwindSegue(segue:)
到达,我为什么要将其投放到我的Any?
。
答案 0 :(得分:0)
您必须进行演员表的原因是发件人是Any?这意味着你不知道你收到了什么。它可以是任何东西或零。但是,您确实发送了两个字符串的元组,您不一定需要进行转换。
问题是你是否以正确的方式解散。通常,发件人是一个对象,它提供有关发件人展开前一个视图控制器的信息。当然,这可以是两个字符串的元组,但是对segue的准备确实需要别的东西。
希望这能为您提供有关该主题的一些信息。