用于分配可选值的Swift简写

时间:2017-10-19 11:48:15

标签: swift

我是Swift的新手,我想知道是否存在将“可选”值分配给非可选值的“短手”形式,而不执行nil检查。

例如,如果我有一个Optional闭包:

var onTap: (() -> Void)?

我稍后可以通过

打电话给我
 onTap?()

?让我跳过零检查并强制解包。

但我很好奇是否有某些不符合要求的价值观。例如

var oldTransform: CGAffineTransform?
var someTransform: CGAffineTransform //non optional

以后,我决定将oldTransform分配给someTransform我必须

if (oldTransform != nil) {
  someTransform = oldTransform!
}

是否有一种模式比上述更简洁(有点像?)?

2 个答案:

答案 0 :(得分:1)

是的,当然。您可以使用if let,如下所示:

if let unwrappedOldTransForm = oldTransform {
    someTransform = unwrappedOldTransForm
}

当你检查是否let时,它将为你解包该值并检查它是否可以将oldTransform的值设置为unwrappedOldTransForm。如果值为nil,您将能够通过添加else条件来处理错误,如下所示:

if let unwrappedOldTransForm = oldTransform {
    someTransform = unwrappedOldTransForm
} else {
    // handle if oldTransform is nil
}

答案 1 :(得分:1)

对于函数,如你所知,“调用”一个nil函数(如enter #!/bin/bash #bash function GO() { pack="$1" cower -ddf $pack cd "/home/$USER/applications/$pack" expect -c " set timeout -1 eval spawn makepkg -Ascfi --noconfirm expect -nocase \"password for $USER:\" {send \"$pass\r\"} interact;" cd "../" } package="$1" echo "I need your password for this, can I have it please?" read -s pass cd "/home/$USER/applications" if [ "$package" == "update" ] then file="/home/$USER/applications/update.pkgs" cower -u > file while IFS= read -r line do package=$(echo $line | cut -d " " -f2) GO $package done <"$file" else GO $package fi echo "have a good day." exit 0 )没有任何效果 - 但对于非可选类型的赋值,你需要提供一个明确的非函数可选值。为此,您可以使用nil-coalescing运算符onTap?(),如下所示:

??

在您的示例中,它将是

var optionalString: String?
// ... maybe set optionalString ...

var realString: String = optionalString ?? "<some default value>"

或甚至,评论员@ user28434建议

someTransform = oldTransform ?? CGAffineTransform(...) // some default - say Identity

如果oldTransform不是nil,则只会更改someTranform。

在每种情况下,如果是非零,则会分配someTransform = oldTransform ?? someTransform // assuming someTransform already initialised 的左手操作数,否则将分配右侧操作数。