我有一个名为MyView.swift的文件,如下所示:
class MyView : UIView {
}
我还有一个MyView.xib文件,其视图的类设置为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的子类...
答案 0 :(得分:4)
您必须隐式解包该可选项,或使用可选链接。
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
}
答案 1 :(得分:3)
MyView
是UIView
的子类,但MyView?
是一个可选的,只有两种可能的情况:
(1)它是nil
或
(2)它包含MyView
...在任何一种情况下,它仍然是一个可选项,这意味着它没有一个名为' frame'的成员。 :)虽然如果它持有MyView
的包装值,那么包裹的值会起作用!
要获得该包装值(假设它有一个),您必须使用!
显式解包它,或者在访问其属性时使用Optional Binding(if let
)。