我想在Swift中找到第一个EKSourceType.Local类型的EKSource,它有一个“单”行表达式。
EKSourceType.Local
EKSource
let eventSourceForLocal = eventStore.sources[eventStore.sources.map({ $0.sourceType }) .indexOf(EKSourceType.Local)!]
是否有更好的方法来实现这一点(例如不使用Map和/或使用find的通用版本)?
find
mdfafbf11#
或者,在Swift3中,您可以用途:
let local = eventStore.sources.first(where: {$0.sourceType == .Local})
wydwbb8l2#
indexOf的一个版本使用 predicate 闭包--使用它来找到第一个本地源代码的索引(如果存在的话),然后在eventStore.sources上使用该索引:
indexOf
eventStore.sources
if let index = eventStore.sources.indexOf({ $0.sourceType == .Local }) { let eventSourceForLocal = eventStore.sources[index] }
或者,您可以通过SequenceType上的扩展添加一个泛型find方法:
SequenceType
extension SequenceType { func find(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? { for element in self { if try predicate(element) { return element } } return nil } } let eventSourceForLocal = eventStore.sources.find({ $0.sourceType == .Local })
(Why这不是已经存在了吗?)
ubby3x7f3#
我完全不明白为什么要使用map。为什么不使用filter呢?这样一来,您将得到所有本地源代码,但实际上可能只有一个,或者根本没有,您可以通过查询第一个源代码(如果没有源代码,则为nil)很容易地找到答案:
map
filter
nil
let local = eventStore.sources.filter{$0.sourceType == .Local}.first
pdsfdshx4#
Swift 4解决方案,它还可以处理数组中没有与条件匹配的元素的情况:
if let firstMatch = yourArray.first{$0.id == lookupId} { print("found it: \(firstMatch)") } else { print("nothing found :(") }
mtb9vblg5#
let arr = [0,1,2,3] let result = arr.lazy.map { print("💥"); return $0 }.first(where: { $0 == 2 }) print(result) // 3x 💥 then 2
"这有什么酷的"你可以在搜索的时候访问元素或i,它是有功能的。
wgx48brx6#
Swift 5如果要从模型数组中查找,请指定**$0.keyTofound否则使用$0**
if let index = listArray.firstIndex(where: { $0.id == lookupId }) { print("Found at \(index)") } else { print("Not found") }
x9ybnkn67#
对于Swift 3,你需要对Nate的答案做一些小的改动。以下是Swift 3的版本:
public extension Sequence { func find(predicate: (Iterator.Element) throws -> Bool) rethrows -> Iterator.Element? { for element in self { if try predicate(element) { return element } } return nil } }
变更:SequenceType〉Sequence,Self.Generator.Element〉Iterator.Element
Sequence
Self.Generator.Element
Iterator.Element
7条答案
按热度按时间mdfafbf11#
或者,在Swift3中,您可以用途:
wydwbb8l2#
indexOf
的一个版本使用 predicate 闭包--使用它来找到第一个本地源代码的索引(如果存在的话),然后在eventStore.sources
上使用该索引:或者,您可以通过
SequenceType
上的扩展添加一个泛型find
方法:(Why这不是已经存在了吗?)
ubby3x7f3#
我完全不明白为什么要使用
map
。为什么不使用filter
呢?这样一来,您将得到所有本地源代码,但实际上可能只有一个,或者根本没有,您可以通过查询第一个源代码(如果没有源代码,则为nil
)很容易地找到答案:pdsfdshx4#
Swift 4解决方案,它还可以处理数组中没有与条件匹配的元素的情况:
mtb9vblg5#
让我们尝试一些更实用的功能:
"这有什么酷的"
你可以在搜索的时候访问元素或i,它是有功能的。
wgx48brx6#
Swift 5如果要从模型数组中查找,请指定**$0.keyTofound否则使用$0**
x9ybnkn67#
对于Swift 3,你需要对Nate的答案做一些小的改动。以下是Swift 3的版本:
变更:
SequenceType
〉Sequence
,Self.Generator.Element
〉Iterator.Element