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

Swift:在单个guard语句中嵌套的选项,swift,optional,Swift,Optional,我试图保护从字符串到浮点到Int的转换: guard let v = Int (Float("x")) else { return -1 } swift 3编译器抱怨: 可选类型“Float”的值未展开;你想用“!”吗还是“?” 但是,添加“?”没有帮助。这里的“!”是不对的,不是吗 不必使用两行或两个保护语句就可以解决此问题吗?Optional有一个函数专门用于此: guard let v = Float("x").map(Int.init) else { return ni

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

guard let v = Int (Float("x")) else {
    return -1
}
swift 3编译器抱怨:

可选类型“Float”的值未展开;你想用“!”吗还是“?”

但是,添加“?”没有帮助。这里的“!”是不对的,不是吗

不必使用两行或两个保护语句就可以解决此问题吗?

Optional有一个函数专门用于此:

guard let v = Float("x").map(Int.init) else {
    return nil
}

您可以使用一个带有中间变量的
guard
语句来执行此操作:

guard let f = Float("x"), case let v = Int(f) else {
    return
}

注意:
case
是解决
Int(f)
不返回可选值这一问题的一种方法。(谢谢你的想法,@Hamish)

你不应该在Swift中使用
-1
作为哨兵值。这正是选择的要点!哈哈,谢谢你指出这一点,尽管这不是我问题的一部分:)你的意思是:
guard let f=Float(“x”),let v=Int(f),否则{
^如果我需要中间层(比如错误记录),我会这样做,但如果我只关心最终结果,我会推荐
map
insteadOh,nevermind。这不起作用,因为
Int(f)
不返回可选值。我知道
map
但不知道如何应用它-到目前为止,我只考虑了数组。Swift一直让我惊讶,我很高兴问你。@ThomasTempelmann
flatMap
map
在单子类型上可用。集合是单子,这是可选的。所以你可以映射和flatMap他们:)@ThomasTempelmann检查一下:只是为了确保:
Int.init
Int($0)
是相同的。虽然第一个是传递一个带有单个参数的函数,第二个是传递一个带参数的闭包?@亲爱的,如果你走
Int($0)
路线,它必须是这样的:
.map({Int($0)}
,因为后面的闭包不能出现在
guard let
语句中。这里不一定需要“case”。@MarqueIV,
case
是一种变通方法,因为
Int(f)
不是可选的。另一种变通方法是
guard let f=Float(str),让v=optional(Int(f)),否则{return}
。哇!我不知道!很高兴我发了帖子,因为你是对的……我没有注意到这不是可选的,这解决了我在同一个案例中遇到的一个问题。谢谢你提供的信息!:)@MarqueIV,谢谢你的提问,而不仅仅是假设我是个白痴;-)。事实上,我是在原始问题下的评论中从Hamish那里学到这一点的。Tech事实上我没有问!;)不过,至少我说了“不确定”。哈哈