【发布时间】:2021-01-28 01:11:57
【问题描述】:
我有一个简单的函数,可以像这样使用firstIndex 在数组中按索引查找特定元素,其中Entry.id 是String:
private func findUserEntry(inEntries entries: [Entry],
currentUserID: String?) -> Entry? {
guard let currentUserID = currentUserID else { return nil }
guard let index = entries.firstIndex(where: { $0.id == currentUserID }) else { return nil }
return entries[index]
}
我正在重构我的代码以尝试以不同的方式完成相同的事情,以此作为一种学习和实践的方式。我认为这个函数会有效地做同样的事情:
private func findUserEntry(inEntries entries: [Entry],
currentUserID: String?) -> Entry? {
guard let currentUserID = currentUserID else { return nil }
return entries
.firstIndex { $0.id == currentUserID }
.map { possibleIndex -> Entry? in
guard let index = possibleIndex else { return nil }
return entries[index]
}
}
但是,我遇到了一个错误:Initializer for conditional binding must have Optional type, not 'Array<Entry>.Index' (aka 'Int')。所以,不知何故,possibleIndex 的值从.firstIndex 变为.map 是Int,而不是我预期的Int?,就像上面的原始版本一样。为什么这里有区别?
【问题讨论】:
-
是的,如果您需要 CaseIterable 枚举的索引,它永远不会失败
标签: swift