当前位置: 首页 > 知识库问答 >
问题:

Swift reduce-为什么值是可选的?

舒仲渊
2023-03-14

为什么可选在线退货总数为 1

return first.enumerated().reduce(0) { total, letter in
   let index = first.index(first.startIndex, offsetBy: letter.offset)
   if first[index] != second[index]{
       return total + 1
   }
   return total
}

当可选值包含“nil”时,必须将可选类型“Int?”的值解包为“Int”类型的值,并使用“?”合并,以提供默认值,当可选值包含“nil”时使用“!”强制解包以中止执行

所以这修复了它:

return first.enumerated().reduce(0) { total, letter in
   let index = first.index(first.startIndex, offsetBy: letter.offset)
   if first[index] != second[index]{
       return total! + 1
   }
   return total
}

如果我将其分解,则会在添加<code>let index</code>时发生更改。。。。

OK -这将返回first的总计数,total不是可选的:

return first.reduce(0) { total, letter in
    return total + 1
}

确定-此枚举和总计不是可选的:

return first.enumerated().reduce(0) { total, letter in
    return total + 1
}

错误 - 这会获得一个编译错误,该错误总数是可选的

return first.enumerated().reduce(0) { total, letter in
    let index = first.index(first.startIndex, offsetBy: letter.offset)
    return total + 1
}

共有1个答案

赵景曜
2023-03-14

为了让您完全得到这个结果(据我所知),封闭函数必须返回一个Int?。这意味着减少可以返回一个可选项。如果没有条件,编译器可以确定减少永远不会返回nil,即永远不会为nil。因此,编译器推断闭包的返回类型是Int。编译器似乎在纠缠减少闭包和的类型推断。一旦您添加了条件,编译器就无法确定减少是否会返回nil。现在,当它不必要地推断的类型时,它会出错。

对我来说,这看起来像是一个快速推理误入歧途的例子。显然,根据< code >枚举的文档,< code>total决不为零。

如果稍微修改一下代码,就会得到预期的结果:

   return first.enumerated().reduce(0) { (total: Int, letter) in
       let index = first.index(first.startIndex, offsetBy: letter.offset)
       if first[index] != second[index]{
          return total + 1
       }
       return total
   }

Swift做了很多类型推断,这真的很棒,因为我得到了强大的类型,同时保留了动态语言的许多好处。然而,以我的经验来看,斯威夫特的推论有时会令人困惑。它轻松处理神秘的情况,并在我认为显而易见的事情上犯了错误。

在我看来这像是一只虫子。

 类似资料:
  • 问题内容: 从Apple的文档中: 您可以使用和一起使用可能缺少的值。这些值表示为可选值。可选值包含一个值或包含一个指示该值丢失的值。在值的类型后写一个问号(),以将该值标记为可选。 为什么要使用可选值? 问题答案: Swift中的可选类型是可以保存值或不保存值的类型。通过将a附加到任何类型来编写可选内容: 可选(以及泛型)是最难理解的Swift概念之一。由于它们是如何编写和使用的,很容易对它们是

  • 为什么要使用可选值?

  • 问题内容: 它以空字符串开头,而不是nil。即使将其显式设置为nil,它仍然是一个空字符串。我不明白 也许通过分配nil使其易于清除?用它编写代码很麻烦。 问题答案: 这是历史性的事情。空字符串和字符串之间没有任何区别。在Objective- C中,无需在两者之间进行区别,因为您可以在Objective-C中调用方法。 同样,在Objective-C中也无法阻止用户分配给属性。生成的合同可以是可选

  • 问题内容: 我读苹果文档 ,当我发现这句话: 本类仅包含一个属性:。 此属性存储对应用程序窗口的引用。此窗口表示应用程序视图层次结构的根。这 是绘制所有应用程序内容的地方。请注意,window属性是 可选的 ,这意味着 在某些时候它可能没有任何值(为nil ) 。 我不明白的是:为什么此属性有时可能为零? 变成零的情况是什么? 问题答案: 当您关闭应用程序时,您的应用程序仍可以接收静默通知 或在后

  • 问题内容: 我在玩以下问题:将Java 8的Optional与Stream ::flatMap一起使用,并想向自定义添加方法,然后检查其是否有效。 更准确地说,我想在其中添加一个,如果不存在任何值,则返回一个空流,如果存在一个元素,则返回一个具有单个元素的流。 但是,我得出的结论是最终结论。 为什么会这样呢?有很多类未声明为final,因此我个人没有理由在此处声明final。 第二个问题是,如果担

  • 问题内容: 我读到try-with-resources 中的块是可选的。我试图在try-with- resources块中创建一个对象,没有后续块,只是从eclipse中获取编译器错误:“ 自动调用引发了未处理的异常类型。” 由于可以在try-with- resources中使用的每个资源都实现了,因此在调用该方法时可能会引发异常,因此我不明白该子句是可选的,因为它不允许我跳过从中捕获异常的过程。