drop(where:{})在Swift中删除(where:{})函数?

时间:2018-05-04 09:05:40

标签: arrays swift collections

Swift标准库中是否有一个函数作用于集合,接受谓词并返回从该集合中删除的值?

目前,我必须分两步实施:

t<- T1[which(T1$Artist%in% unique(C1$Artist) | T1$FeatArtist%in% unique(C1$Artist)& T1$Date > max(C1$Date)),] 

但我想,存在类似的功能。

目标

我有以下数组:

guard let idx = allAnnotations.index(where: {$0 is MKUserLocation}) else {return}
let userLocation = allAnnotations.remove(at: idx) as! MKUserLocation

[Type1, Type1, Type1, Type1, Type1, Type1, Type2] 可能存在也可能不存在于数组中。除了这两个之外没有其他类型。

我需要将它分成两个元素:

Type2

[Type1, Type1, Type1, Type1, Type1, Type1]

这就是我正在寻找的功能。

5 个答案:

答案 0 :(得分:2)

这是一个返回已删除元素数组的扩展名:

extension Array {
    mutating func dropWhere(_ isIncluded: (Element) throws -> Bool) -> [Element] {
        do {
            let reverseArray = try filter { try isIncluded($0) }
            self = try filter { try !isIncluded($0) }

            return reverseArray
        } catch {
            return []
        }
    }
}

只需拨打电话就可以拨打filter

var array = [1, 2, 3]
let array2 = array.dropWhere { $0 > 2 }
print(array) //[1, 2]
print(array2) //[3]

答案 1 :(得分:2)

Swift 5具有removeAll(where)

    @inlinable public mutating func removeAll(where shouldBeRemoved: (Element) throws -> Bool) rethrows

您可以像这样使用它-

    [1,2,3].removeAll(where: { $0 == 2})

Apple Docs

答案 2 :(得分:1)

你可以在条件上使用Split来切片你的数组

    var typeList =  [Type1, Type1, Type1, Type1, Type1, Type1, Type2]

    var slicedArray:[ArraySlice] = typeList.split { (value) -> Bool in
                return value == YourCondition
            }
print(slicedArray)

答案 3 :(得分:1)

此扩展获取谓词,并返回与谓词匹配的元素。此外,从数组中删除元素。

getSupportFragmentManager()

<强> TEST:

android.support.v4.fragment

<强>输出

extension Array {
    mutating func popFirstElementWith(_ predicate:(Element)->(Bool)) -> Element? {
        var firstElement:Element?
        self = self.compactMap({ (element:Element) -> Element? in
            guard predicate(element) == true else {
                return element
            }
            if firstElement == nil {
                firstElement = element
            }
            return nil
        })
        return firstElement
    }
}

答案 4 :(得分:0)

代码我已完成:

extension Array {
  mutating func popFirstElementWith(_ predicate:(Element)->(Bool)) -> Element? {
    for (idx, element) in enumerated() {
      if predicate(element) {
        remove(at: idx)
        return element
      }
    }
    return nil
  }
}