我是Swift的新手,我想知道是否存在将“可选”值分配给非可选值的“短手”形式,而不执行nil检查。
例如,如果我有一个Optional闭包:
var onTap: (() -> Void)?
我稍后可以通过
打电话给我 onTap?()
?
让我跳过零检查并强制解包。
但我很好奇是否有某些不符合要求的价值观。例如
var oldTransform: CGAffineTransform?
var someTransform: CGAffineTransform //non optional
以后,我决定将oldTransform
分配给someTransform
我必须
if (oldTransform != nil) {
someTransform = oldTransform!
}
是否有一种模式比上述更简洁(有点像?
)?
答案 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
的左手操作数,否则将分配右侧操作数。