将字符串传递给第二个视图控制器

Pass a string to a second view controller

我正在尝试将字符串传递给第二个视图控制器。该字符串是新视图控制器的标题。 要传递字符串,我可以使用 2 种解决方案,这两种解决方案都可以正常工作,但对我来说,区别并不那么明显。谁能给我解释一下区别?

这里是第一个解决方案:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if (segue.identifier == "settime") {
            let svc = segue.destinationViewController as! timeSetting;
            //Assign the new title
            svc.toPass = "New Title"

        }
    }

这里是第二个解决方案:

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if (segue.identifier == "settime") {
            let svc = segue.destinationViewController as? timeSetting;
            //Assign the new title
            svc!.toPass = "New Title"

        }
    }

变量toPass是第二个这样定义的viewController:

 var toPass:String = "Title"

他们是一样的。

如果有区别,就是解包可选值的时候了。在第一个解决方案中,svc 的类型是 timeSetting。在第二种方案中,svc的类型是timeSetting?.

您的两个代码都可以正常工作,而且工作方式相同。

唯一的区别在于可选的转换。

Optional in Swift

两种解决方案将执行相同的操作。在我看来,第一种解决方案是首选,因为它更准确地表达了您的意图。

通过声明 let svc = segue.destinationViewController as! timesetting,您声明目标视图控制器肯定是 timesetting 类型。

第二种形式测试目标视图控制器是否为timeSetting类型。如果是,则变量 svc 将具有 non-nil 值。

如果您要定义另一个呈现不同类型视图控制器的同名 segue,那么这两种解决方案都将失败; as! 子句上的第一个和当您尝试展开 svc! 时的第二个,这将是零。

两者都可以,但我认为最好的方法是像下面这样打开可选的:

if let svc = segue.destinationViewController as? timeSerting { svc.toPass = "xx" }