当编写一个新的swift类时,当我(不)使用隐式展开的可选对象而不是普通的可选对象时,我还是不太满意。据我所知,如果您从不希望它的值为零,则可以隐式地将它们分配为可包装的(和可选的)。如果为nil,则为异常事件,应导致运行时错误。
以这个简单的登录视图为例,该视图包含两个文本字段成员变量:
class SignInFieldView : UIView {
var emailField: UITextField!;
var passField: UITextField!;
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder);
commonInit();
}
convenience override init(frame: CGRect) {
self.init(frame: frame);
commonInit();
}
func commonInit() {
layoutEmail();
layoutPass();
}
// MARK: Layout Text Fields
func layoutEmail() {
let rect = CGRect(x: bounds.origin.x, y: bounds.origin.y, width: bounds.size.width, height: (bounds.size.height * 0.5));
emailField = UITextField(frame: rect);
addSubview(emailField);
}
func layoutPass() {
let rect = CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height * 0.5), width: bounds.size.width, height: (bounds.size.height * 0.5));
passField = UITextField(frame: rect);
addSubview(passField);
}
}
在上面的类中,emailField和passField都被分类为隐式未包装的可选参数,因为我从不希望它们在整个superview的生命周期中都为零。我没有将它们分配为常量,因为我希望它们的初始化取决于superview的状态(frame / bounds / etc)。我省略了多余的代码来保持此示例的干净。
对初始化成员使用隐式展开的可选对象是否正确且有效?
除非有充分的理由使用它们,否则我将远离隐式展开的可选内容。尽可能使用非可选,否则使用可选。如果使用不当,则隐式展开将非常危险,因为它们会绕过编译器检查并生成运行时异常。
何时使用隐式解包的情况的非详尽清单:
后一种用法的典型情况是在中UIViewController
,当在viewDidLoad
方法中而不是在初始化器中初始化属性时-使用隐式解包是有意义的。
在这种情况下,请勿使用隐式解包:
在您的特定情况下,尽管属性是在Initializator中实例化的,但它们依赖于超类的初始化,因此将它们声明为隐式展开是有意义的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句