Swift:单个guard语句中的嵌套选项

Tho*_*ann 3 optional swift

我试图保护从字符串到Float到Int的转换:

guard let v = Int (Float("x")) else {
    return -1
}
Run Code Online (Sandbox Code Playgroud)

swift 3编译器抱怨:

可选类型'Float?'的值 没有打开; 你的意思是用'!' 要么 '?'?

添加"?" 但是没有帮助.并且"!" 这里会错的,不是吗?

是否有可能解决这个问题,而不必使用两行或两个保护声明?

Ale*_*ica 7

Optional有一个map专门用于此的功能:

guard let v = Float("x").map(Int.init) else {
    return nil
}
Run Code Online (Sandbox Code Playgroud)


vac*_*ama 5

你可以用一个guard带有中间变量的语句来做到这一点:

guard let f = Float("x"), case let v = Int(f) else {
    return
}
Run Code Online (Sandbox Code Playgroud)

注意:case存在作为Int(f)不返回可选值这一事实的解决方法。(感谢您的想法,@Hamish)

  • @MarqueIV,`case` 是一种解决方法,因为 `Int(f)` 不是可选的。另一种解决方法是`guard let f = Float(str), let v = Optional(Int(f)) else { return }`。 (2认同)