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]
这就是我正在寻找的功能。
答案 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})
答案 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
}
}