[英]Cannot convert a viewController object to viewController type in Swift
我想將數據從一個視圖控制器傳遞到另一個。 我在prepareForSegue
使用以下代碼來執行此操作...
let detailVC: DetailVC = segue.destinationViewController as! DetailVC
detailVC.alertDict = sender as! NSDictionary
如您所見,在第一行中有一個!
之后。 那是因為我必須使用它來強制向下轉換 ,如果不包括在內,則!
然后我得到一個錯誤: UIViewController
不能轉換為DetailVC
。 但是DetailVC
是UIViewController
類的繼承,所以為什么不能轉換? 這是該類的代碼。
class DetailVC: UIViewController, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate {/*code*/}
所有的DetailVCs
都是UIViewControllers
,但並非所有的 UIViewControllers
都是DetailVCs
。
因此,盡管您可以將DetailVC
自由轉換為UIViewController
例如:
let detailVC = DetailVC()
let vc : UIViewController = detailVC as UIViewController
您不能進行相反操作,因為視圖控制器可能不是DetailVC
。
因此,您可以as!
為了強制轉換到DetailVC
。
let vc : UIViewController = DetailVC()
let detailVC = vc as! DetailVC
如果它是DetailVC
,那么它將DetailVC
轉換。 如果不是,它將崩潰。
如果您在投放之前不確定100%的類型,則應始終使用as?
為了在轉換之前檢查類型。 例如:
let vc : UIViewController = DetailVC()
if let detailVC = vc as? DetailVC {
// do something
}
或者,如user965972所言,如果強制轉換失敗,則可以使用guard
語句來阻止進一步執行操作,從而使操作更進一步。 例如:
let vc : UIViewController = DetailVC()
guard let detailVC = vc as? DetailVC else {
// uh oh, casting failed. maybe do some error handling.
return
}
// freely use detailVC from the this point onwards, with the correct type.
您使用的方法完全取決於您是否要處理錯誤,以及是否進一步執行取決於轉換是否成功。
我假設您遇到運行時錯誤。
確保在界面生成器中將視圖控制器設置為正確的類。 如果您首先在IB中設置類,然后在代碼中定義該類,則IB將找不到該類。 通過查看IB中“類”字段下的“模塊”字段,您會注意到這一點。 它不應為“ None”,而應類似於項目的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.