簡體   English   中英

無法在Swift中將viewController對象轉換為viewController類型

[英]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 但是DetailVCUIViewController類的繼承,所以為什么不能轉換? 這是該類的代碼。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM