让绑定成功所需的不必要的条件转换(编译器警告)

时间:2016-11-05 12:36:50

标签: ios swift3

我有条件转换的奇怪行为,应用程序没有问题,但我试图理解为什么会发生这种情况。问题是当我尝试在sender: performSegue参数中传递元组时。

我的Navigation ControllerStoryboard 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?

1 个答案:

答案 0 :(得分:0)

您必须进行演员表的原因是发件人是Any?这意味着你不知道你收到了什么。它可以是任何东西或零。但是,您确实发送了两个字符串的元组,您不一定需要进行转换。

问题是你是否以正确的方式解散。通常,发件人是一个对象,它提供有关发件人展开前一个视图控制器的信息。当然,这可以是两个字符串的元组,但是对segue的准备确实需要别的东西。

希望这能为您提供有关该主题的一些信息。