将一个类赋值给一个名为Swift的常量的操作是什么?

c9qzyr3d  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(118)

我正在尝试弄清楚委托和协议,并学习教程。它有以下代码:

class SelectTimeViewController: UIViewController, PopupDelegate{
...
 let sb = UIStoryboard(name: "DatePopupViewController", bundle: nil) 
 let popup = sb.instantiateInitialViewController() as! DatePopupViewController          
 popup.delegate = self
…
}

代码中的这一行是什么意思?

let popup = sb.instantiateInitialViewController() as! DatePopupViewController

我知道这里我们创建了一个弹出窗口常量并为其赋值,然后将其转换为DatePopupViewController类。
但这更普遍地意味着什么呢?
1.我们是否创建了DatePopupViewController类的示例?
1.我们是否将DatePopupViewController类中的任何值分配给let弹出窗口?
1.我们是否创建了DatePopupViewController类的副本?
更新:关于#1。
通常,当我们创建一个类的示例时,我们使用以下语法:

constant (or variable) = ClassName (initializer)

例如:

var item = Item(name: "Car")

在这个例子中,语法是不同的。我们没有初始化器(括号)。

let popup = ... DatePopupViewController

在这种情况下,我们可以说已经在这里创建了类的示例吗?

dgjrabp2

dgjrabp21#

您的故事板有一个或多个场景。每个场景都由一个view controller管理。通常您会为每个场景创建一个自定义的UIViewController子类。在故事板编辑器中,为每个场景键入该自定义类的名称。
故事板中的一个场景可以标记为“初始场景”。UIStoryboard有一个方法instantiateInitialViewController,可以从故事板中加载该场景。
但是世界上有很多很多故事板,它们使用很多不同的自定义UIViewController子类作为场景。你甚至可以在一个应用程序中有多个故事板,每个故事板都有一个使用不同自定义子类的初始场景。
在编译时,UIStoryboard无法知道instantiateInitialViewController要加载什么类,它只知道要加载UIViewController,或者UIViewController的子类,所以instantiateInitialViewController声明为返回UIViewController
但是当你写代码的时候,你通常知道它要加载哪个子类,而且你经常想做一些依赖于子类的事情。在你发布的代码中,你设置了一个名为delegate的属性,这是一个特定于DatePopupViewController的属性,而不是UIViewController的属性。
为了访问delegate属性,你需要告诉Swift你所知道的Swift还不知道的东西,你需要告诉Swift你正在加载一个DatePopupViewController,你可以使用一个名为“cast”的语法来完成这个任务:

let popup = sb.instantiateInitialViewController() as! DatePopupViewController 
↑   ↑       ↑  ↑                                  ↑   ↑
|   |       |  This method returns a              |   The subclass you know
|   |       |  UIViewController object. It        |   you're loading.
|   |       |  might be (and usually is) a        |
|   |       |  subclass of UIViewController.      The cast operator.
|   |       |                                     The ! means the program
|   |       This variable references              will crash if the
|   |       a UIStoryboard object,                loaded object is not
|   |       which represents a                    an instance of
|   |       storyboard at runtime.                DatePopupViewController.
|   |
|   This variable gets bound to the
|   newly-loaded DatePopupViewController.
|
This says that the popup variable cannot
be changed to point at a different
instance of DatePopupViewController.

相关问题