ios - 初始化中隐式解包的可选值 - Swift

标签 ios design-patterns swift option-type

在编写新的 swift 类时,当(不)使用隐式展开的选项而不是简单的选项时,我仍然不是 100% 舒服。据我所知,如果您从未期望它的值为零,则将某些内容分配为隐式解包(并且可选)应该可以。如果它为零,则这是一个异常事件,应该会导致运行时错误。

以这个包含两个文本字段成员变量的简单登录 View 为例:

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 都被归类为隐式解包选项,因为我从不期望它们在其 super View 的整个生命周期中为零。我不将它们分配为常量,因为我希望它们的初始化取决于 super View 的状态(框架/边界/等)。我省略了额外的代码以保持此示例的简洁。

对初始化成员使用隐式解包选项是否正确且有效?

最佳答案

我会远离隐式展开的选项除非有充分的理由使用它们。如果可能,使用非可选,否则使用可选。如果使用不当,隐式解包非常危险,因为它们会绕过编译器检查并生成运行时异常。

何时使用隐式解包的情况的非详尽列表:

后一种用法的典型情况是在 UIViewController 中,当属性在 viewDidLoad 方法中而不是在初始化程序中初始化时 - 使用隐式展开。

在这种情况下不要使用隐式解包:

  • 因为这很酷
  • 因为它可以让您保存键盘上的按键
  • 当您不能 100% 确定是否使用它时

在您的具体情况下,虽然属性是在初始化器中实例化的,但它们依赖于父类(super class)初始化,因此将它们声明为隐式解包是有意义的。

关于ios - 初始化中隐式解包的可选值 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26110207/

相关文章:

ios - 我的 View Controller 没有出现在屏幕上

java - 动态地将自定义功能添加到服务/服务中介

c++ - 通过传递不同的参数创建对象

ios - 在 View 呈现模态视图时执行 segue

ios - 如何在 iOS 上将编码的 CMSampleBuffer 样本保存到 mp4 文件

iphone - 比较两个双变量 Objective-C

ios - Xcode - 我的应用程序崩溃,错误是 "Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug"

java - 生成器模式 : Why do we need . build()?

ios - Swift tableview在删除单元格过程indexPath.row问题

swift - contentoffset UIScrollView Swift 的平滑移动