swift2 在Swift数组中查找匹配条件的第一个元素(例如EKSource)

tv6aics1  于 2022-11-06  发布在  Swift
关注(0)|答案(7)|浏览(226)

我想在Swift中找到第一个EKSourceType.Local类型的EKSource,它有一个“单”行表达式。

let eventSourceForLocal = 
    eventStore.sources[eventStore.sources.map({ $0.sourceType })
        .indexOf(EKSourceType.Local)!]

是否有更好的方法来实现这一点(例如不使用Map和/或使用find的通用版本)?

mdfafbf1

mdfafbf11#

或者,在Swift3中,您可以用途:

let local = eventStore.sources.first(where: {$0.sourceType == .Local})
wydwbb8l

wydwbb8l2#

indexOf的一个版本使用 predicate 闭包--使用它来找到第一个本地源代码的索引(如果存在的话),然后在eventStore.sources上使用该索引:

if let index = eventStore.sources.indexOf({ $0.sourceType == .Local }) {
    let eventSourceForLocal = eventStore.sources[index]
}

或者,您可以通过SequenceType上的扩展添加一个泛型find方法:

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这不是已经存在了吗?)

ubby3x7f

ubby3x7f3#

我完全不明白为什么要使用map。为什么不使用filter呢?这样一来,您将得到所有本地源代码,但实际上可能只有一个,或者根本没有,您可以通过查询第一个源代码(如果没有源代码,则为nil)很容易地找到答案:

let local = eventStore.sources.filter{$0.sourceType == .Local}.first
pdsfdshx

pdsfdshx4#

Swift 4解决方案,它还可以处理数组中没有与条件匹配的元素的情况:

if let firstMatch = yourArray.first{$0.id == lookupId} {
  print("found it: \(firstMatch)")
} else {
  print("nothing found :(")
}
mtb9vblg

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,它是有功能的。

wgx48brx

wgx48brx6#

Swift 5如果要从模型数组中查找,请指定**$0.keyTofound否则使用$0**

if let index = listArray.firstIndex(where: { $0.id == lookupId }) {
     print("Found at \(index)")
} else {
     print("Not found")
 }
x9ybnkn6

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
    }
}

变更:SequenceTypeSequenceSelf.Generator.ElementIterator.Element

相关问题