Har*_*shi 0 uiviewcontroller ios swift
我想将数据从一个视图控制器传递到另一个.我正在使用以下代码prepareForSegue来做到这一点......
let detailVC: DetailVC = segue.destinationViewController as! DetailVC
detailVC.alertDict = sender as! NSDictionary
Run Code Online (Sandbox Code Playgroud)
在第一行,你可以看到有一个!在as之后.多数民众赞成因为我必须使用它来强制转发,如果我不包括!那么我得到一个错误:UIViewController不能转换为DetailVC.但是DetailVC是UIViewController类的继承,为什么它不能转换?这是该类的代码..
class DetailVC: UIViewController, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate {/*code*/}
Run Code Online (Sandbox Code Playgroud)
所有的DetailVCs都是UIViewControllers,但不是所有的 UIViewControllers都是DetailVCs.
因此,虽然你可以自由地转换DetailVC为UIViewController如:
let detailVC = DetailVC()
let vc : UIViewController = detailVC as UIViewController
Run Code Online (Sandbox Code Playgroud)
你不能这样做,因为视图控制器可能不是DetailVC.
因此你可以使用as!以强制演员阵容DetailVC.
let vc : UIViewController = DetailVC()
let detailVC = vc as! DetailVC
Run Code Online (Sandbox Code Playgroud)
如果它是a DetailVC,那么它将转换没有问题; 如果不是,它会崩溃.
如果您在演员之前不是100%确定类型,则应始终使用as?以便在转换前检查类型.例如:
let vc : UIViewController = DetailVC()
if let detailVC = vc as? DetailVC {
// do something
}
Run Code Online (Sandbox Code Playgroud)
或者,正如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.
Run Code Online (Sandbox Code Playgroud)
您使用的方法完全取决于您是否要处理错误以及是否进一步执行取决于转换是否成功.
| 归档时间: |
|
| 查看次数: |
2772 次 |
| 最近记录: |