我正在嘗試弄清楚委托和協議并研究教程。它有以下代碼:
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 類。
但這更普遍地意味著什么?
- 我們是否創建了 DatePopupViewController 類的實體?
- 我們是否從 DatePopupViewController 類中分配了任何值?
- 還要別的嗎?
uj5u.com熱心網友回復:
您的故事板有一個或多個場景。每個場景都由一個視圖控制器管理。通常,您將為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.
uj5u.com熱心網友回復:
我將逐步向您解釋代碼...
class SelectTimeViewController: UIViewController, PopupDelegate{
類的定義SelectTimeViewController
,它是一個UIViewController
并實作PopupDelegate
協議。SelectTimeViewController
只能因為這個實作的協議而作為代理作業。
let sb = UIStoryboard(name: "DatePopupViewController", bundle: nil)
從檔案創建故事板物件DatePopupViewController.storyboard
。
let popup = sb.instantiateInitialViewController() as! DatePopupViewController
ViewController
實體化此情節提要物件中的初始值。ViewController
您可以通過情節提要檔案中的箭頭識別首字母。請記住,情節提要中的每個視圖都有一個ViewController
. 因此,您可以與ViewController
. 在你的情況下ViewController
是DatePopupViewController
.
你可以省略as! DatePopupViewController
. 在這種情況下,popup
常量只是型別ViewController
,您不能訪問DatePopupViewController
.
popup.delegate = self
您的實體化DatePopupViewController
現在已分配給popup
常量。所以你可以通過常量訪問DatePopupViewController
的屬性。popup
我們已經PopupDelegate
在第一行代碼中實作了協議。因此我們可以將當前類 ( SelectTimeViewController
) 設定為 的委托DatePopupViewController
。
概括:
- 是的,分配給
popup
- 是的,
delegate
的DatePopupViewController
- 看上面
uj5u.com熱心網友回復:
關于#1。
通常,當我們創建類的實體時,我們使用以下語法:
常量(或變數)= ClassName(初始化器)
例如:
var item = Item(name: "Car")
在這種情況下,語法是不同的:
let popup = ... DatePopupViewController
也就是說,這里沒有類初始化器。
那為什么我們稱之為類實體的創建呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516568.html
標籤:迅速代码代表协议
上一篇:/在腳本變數中
下一篇:如何將字串陣列均勻地分成組