在Swift中观察视图时理解类型转换

时间:2015-07-24 02:57:40

标签: swift segue

我试图了解以下代码的工作原理/为什么需要它:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
     if segue.identifier == "showPlaylistDetails" 
          let playlistDetailController = segue.destinationViewController as! PLaylistDetailViewController 
          playlistDetailController.segueLabelText = "Yay! It worked"
 }

我理解需要覆盖默认的' prepareForSegue' function - 然后指定它是UIStoryboardSegue。此外,我理解需要使用if语句来检查我为这个特定segue命名的标识符是否正确(以确保我正在谈论正确的segue)

然而,我迷路的地方是

 let playlistDetailController = segue.destinationViewController as! PlaylistDetailViewController

我做了一些研究,并了解到你需要将一种元素转发给它真实的'子类。 apple docs给出的一个例子是一个包含两个独立子类的几个对象的数组 - 并且需要遍历它们并将每个对象视为它真实的对象。子类 - 不是它的父类,只是因为它与数组中的其他所有内容有共同之处。

我不明白为什么我们需要让segue.destinationViewController充当' PlaylistDetailViewController' (我的segue指向的控制器的名称。)

假设但尚未找到正确解释的地方,是segue.destinationViewController(没有双关语!:P)PlaylistDetailViewController。但是在这个函数中我需要使用segue的点方法(我假设是Class?)但是,segue没有能力引用控制器内部的变量(也许是因为它太模糊了?或作为安全预防措施,因为它可能经常在代码中使用)。

但是为什么它需要我打开PlaylistDetailViewController - 如果我们知道它们是相同的,那么我们知道它不会返回nil。如果有可能在目的地上返回nil(我不认为它是什么?)为什么我们不需要打开segue.destinationViewController?更不用说我们正在使用常量播放列表详细信息控制器 - 为什么我们只是让它成为一个如果让我解开。

看起来很简单,我们应该可以说

 segue.destinationViewController.segueLabelText = "Yay it worked!"

或者至少

PlaylistDetailViewController.segueLabelText = "Yay it worked!"

1 个答案:

答案 0 :(得分:0)

因为segue.destinationViewController可以是任何类型的子类UIViewController,它需要知道它所基于的类,因此它知道它加载了什么。它是在您定义的变量中创建类的实例。

如果您愿意,可以使用if let。见https://stackoverflow.com/a/29360924/4096655