我有一个名为myview。swift的文件,它看起来像这样:
class MyView : UIView {
}
我还有一个MyView。
在视图控制器中,我有这个:
var myView: MyView?
override func viewDidLoad() {
super.viewDidLoad()
self.myView = NSBundle.mainBundle().loadNibNamed("MyView", owner: nil, options: nil)[0] as MyView
self.myView.frame = frame;
self.view.addSubview(self.myView);
}
我得到这个错误:
MyView? does not have a member named 'frame'
为什么?MyView是UIView的子类
您必须隐式地展开可选内容,或者使用可选链接。
self.myView!.frame = frame
或者使用可选的链接。
self.myView?.frame = frame
// can do this now in Swift.
第一个选项更危险,因为当您强制展开可选选项时,如果它是nil
,将会发生运行时错误。
编辑我很抱歉,可选链接不是适合这里工作的工具。如果您想查询框架的值,它是正确的工具。或者,您可以使用if let
语法。
if let optionalView = self.myView {
var queriedFrame = optionalView.frame
}
MyView
是UIView
的子类,但MyView?
是一个Optional,只有两种可能的情况:
(1)是nil
,或者
(2)保存类型为MyView
的包装值
…在任何一种情况下,它仍然是一个可选的,这意味着它没有一个名为'frame'的成员:),尽管如果它持有MyView
的包装值,那么包装值确实如此!
要获得包装的值(假设它有一个),您有必要使用!
显式地展开它,或者使用可选绑定(if let
)来访问它的属性。