【发布时间】:2019-06-07 09:11:21
【问题描述】:
为什么total 在线return total + 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
}
可选类型“Int?”的值必须解包为 使用 '??' 键入'Int' Coalesce可选时提供默认值 值包含 'nil' 使用 '!' 强制展开中止执行,如果 可选值包含 '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
}
如果我将其分解,则添加 let index.... 时会发生更改。
OK - 这将返回 first 的总数,并且 total 不是可选的:
return first.reduce(0) { total, letter in
return total + 1
}
好的 - 这个枚举和总计不是可选的:
return first.enumerated().reduce(0) { total, letter in
return total + 1
}
ERROR - 这会得到一个编译错误,total 是可选的
return first.enumerated().reduce(0) { total, letter in
let index = first.index(first.startIndex, offsetBy: letter.offset)
return total + 1
}
【问题讨论】:
-
first的类型是什么?你在哪里写这段代码? -
你能提供一个minimal reproducible example吗?我猜你所在函数的返回类型是可选的,因此因为bodies of multi-statement closures don't participate in type inference,编译器假设
Result占位符完全绑定到返回类型。 -
另请注意,您的代码(除非我弄错了)表现出未定义的行为:
index在第一个字符串的索引中,并且不能用作不同字符串的下标。 – 顺便说一句,如果目的是计算两个字符串的不同字符的数量:有更简单的解决方案。 -
这两个字符串 具有 相同的计数(三个)。 –
return zip(first, second).filter(!=).count将是一个与您的代码等效的简单解决方案。 -
@Turnipdabeets 这是因为表情符号字符不能用单个字节表示。试试
"????????????".utf8.count
标签: swift reduce enumeration