代码之家  ›  专栏  ›  技术社区  ›  bhartsb

强制展开或使用可选链接设置属性

  •  0
  • bhartsb  · 技术社区  · 6 年前

    给定可选变量 pinImageView: UIImageView? 其中有已设置的属性,我不确定首选哪种方式设置该属性。例如:

    if let image = UIImage(named: "Pin") {
        pinImageView = UIImageView(image: image)
        pinImageView?.restorationIdentifier = "pin"
    }
    

    if let image = UIImage(named: "Pin") {
        pinImageView = UIImageView(image: image)
        pinImageView!.restorationIdentifier = "pin"
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   vacawama    6 年前

    最好走哪条路

    一般认为你应该避免 ! ( 强制展开 )这只是在乞求碰撞,因此应避免使用:

    if let image = UIImage(named: "Pin") {
        pinImageView = UIImageView(image: image)
        pinImageView!.restorationIdentifier = "pin"
    }
    

    在这种情况下,因为您刚分配了 pinImageView ,强制打开是安全的, 但是 它仍然会向您或将来读取您的代码的任何其他人发出危险信号。”啊,他们在用武力打开这里。那会坠毁吗?好吧,可以 PinImageView(PinImageView) nil ?不,它只是在前一行中分配的,所以没关系。“为什么要让自己和他人经历这个思考过程;避免 ! 只要可能。

    此用法:

    if let image = UIImage(named: "Pin") {
        pinImageView = UIImageView(image: image)
        pinImageView?.restorationIdentifier = "pin"
    }
    

    更安全,因为它使用 可选链接 打开 PinImageView(PinImageView) 并避免 碰撞操作员 ! ,但它仍然展开一个可选变量。

    第三种选择:

    ImageView是可选的原因是您已经将其分配给了可选变量。如果相反,则使用 let 常量以在配置对象时保持该对象,可以避免用展开代码填充代码:

    if let image = UIImage(named: "Pin") {
        let imageView = UIImageView(image: image)
        imageView.restorationIdentifier = "pin"
        pinImageView = imageView
    }
    

    当您为对象分配许多属性时,此方法工作得很好,因为您可以避免许多展开操作符。

    别担心 额外代码行 . 编译器将对此进行优化。可读性和清晰度代码。

        2
  •  0
  •   Jon N    6 年前

    我们的团队中有一个代码样式/评审规则 使用!没有说明安全原因的操作员。

    因为!销毁NIL安全在SWIFT中的所有优点,偶然使用它会导致崩溃,并将语言拖回C/C++/爪哇/C/JavaScript等NulePoExtExeExt地狱。

    所以在你的情况下

    pinImageView?.restorationIdentifier = "pin"
    

    选择绝对是首选。