初始化中隐式展开的可选对象-Swift

泰勒·哈利代(Taylor Halliday)

当编写一个新的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)。我省略了多余的代码来保持此示例的干净。

对初始化成员使用隐式展开的可选对象是否正确且有效?

安东尼奥

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

何时使用隐式解包的情况的非详尽清单:

  • 当有API返回隐式展开的API时
  • 解决类实例之间强引用循环问题
  • 当您拥有一个class / struct属性(根据设计)永远不会为nil,但是无法在初始化程序中进行设置时

后一种用法的典型情况是在中UIViewController,当在viewDidLoad方法中而不是在初始化器中初始化属性时-使用隐式解包是有意义的。

在这种情况下,请勿使用隐式解包:

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

在您的特定情况下,尽管属性是在Initializator中实例化的,但它们依赖于超类的初始化,因此将它们声明为隐式展开是有意义的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

初始化中隐式展开的可选对象-Swift

来自分类Dev

在Swift中包装和展开可选对象时会发生什么?

来自分类Dev

Swift可选的初始化

来自分类Dev

Swift是否像C#一样具有隐式对象初始化器?

来自分类Dev

在Apple Swift中,在什么情况下我不希望隐式展开可选内容?

来自分类Dev

Swift中的一步式对象创建和属性初始化?

来自分类Dev

循环遍历 Swift 4 中的可选对象

来自分类Dev

Swift How To-检查可选对象数组的First / Where语句-展开并匹配

来自分类Dev

Swift函数-传递可选对象

来自分类Dev

NSCalendar初始化展开为nil,Swift

来自分类Dev

Swift类中的自定义init给出“属性未在隐式生成的super.init调用中初始化”错误?

来自分类Dev

在Swift 2.2中显式展开对可选属性的分配

来自分类Dev

Swift的“隐式展开的可选内容”与Java的整数“自动装箱”有何不同?

来自分类Dev

带有隐式展开的可选的Swift一元运算符

来自分类Dev

为什么Swift闭包变量类型不能隐式展开为可选?

来自分类Dev

同时初始化和绑定swift可选成员?

来自分类Dev

Swift中具有可选值的数组初始化器速记

来自分类Dev

Swift中的NSCalendar-初始化可以返回nil,但不是可选的

来自分类Dev

在 Swift 3.1 中从 init!() 隐式解包可选

来自分类Dev

Xcode 6.3&Swift错误:目标C方法“ init”由隐式初始化程序“ init()”定义

来自分类Dev

在Swift中,如何避免同时使用可选对象和nil对象?

来自分类Dev

为什么'+ ='不适用于隐式展开的可选对象?

来自分类Dev

泛型不适用于隐式展开的可选对象

来自分类Dev

初始化期间的Swift可选值可防止默认初始化程序继承

来自分类Dev

Swift中的惰性属性初始化

来自分类Dev

Swift中的类初始化

来自分类Dev

Swift初始化程序中的错误

来自分类Dev

在Swift中初始化类常量

来自分类Dev

在Swift中覆盖初始化器

Related 相关文章

  1. 1

    初始化中隐式展开的可选对象-Swift

  2. 2

    在Swift中包装和展开可选对象时会发生什么?

  3. 3

    Swift可选的初始化

  4. 4

    Swift是否像C#一样具有隐式对象初始化器?

  5. 5

    在Apple Swift中,在什么情况下我不希望隐式展开可选内容?

  6. 6

    Swift中的一步式对象创建和属性初始化?

  7. 7

    循环遍历 Swift 4 中的可选对象

  8. 8

    Swift How To-检查可选对象数组的First / Where语句-展开并匹配

  9. 9

    Swift函数-传递可选对象

  10. 10

    NSCalendar初始化展开为nil,Swift

  11. 11

    Swift类中的自定义init给出“属性未在隐式生成的super.init调用中初始化”错误?

  12. 12

    在Swift 2.2中显式展开对可选属性的分配

  13. 13

    Swift的“隐式展开的可选内容”与Java的整数“自动装箱”有何不同?

  14. 14

    带有隐式展开的可选的Swift一元运算符

  15. 15

    为什么Swift闭包变量类型不能隐式展开为可选?

  16. 16

    同时初始化和绑定swift可选成员?

  17. 17

    Swift中具有可选值的数组初始化器速记

  18. 18

    Swift中的NSCalendar-初始化可以返回nil,但不是可选的

  19. 19

    在 Swift 3.1 中从 init!() 隐式解包可选

  20. 20

    Xcode 6.3&Swift错误:目标C方法“ init”由隐式初始化程序“ init()”定义

  21. 21

    在Swift中,如何避免同时使用可选对象和nil对象?

  22. 22

    为什么'+ ='不适用于隐式展开的可选对象?

  23. 23

    泛型不适用于隐式展开的可选对象

  24. 24

    初始化期间的Swift可选值可防止默认初始化程序继承

  25. 25

    Swift中的惰性属性初始化

  26. 26

    Swift中的类初始化

  27. 27

    Swift初始化程序中的错误

  28. 28

    在Swift中初始化类常量

  29. 29

    在Swift中覆盖初始化器

热门标签

归档