удалить (где: {}) удалить (где: {}) функцию в Swift? - PullRequest
0 голосов
/ 04 мая 2018

Есть ли в стандартной библиотеке Swift функция, которая действует на коллекцию, принимает предикат и возвращает значение, удаленное из этой коллекции?

В настоящее время я должен реализовать его в 2 этапа:

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]

и

Type2?

Это функция, которую я ищу.

Ответы [ 5 ]

0 голосов
/ 19 июня 2019

Swift 5 имеет removeAll (где)

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

Вы можете использовать это так -

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

Apple Docs

0 голосов
/ 09 мая 2018

Код, с которым я закончил:

extension Array {
  mutating func popFirstElementWith(_ predicate:(Element)->(Bool)) -> Element? {
    for (idx, element) in enumerated() {
      if predicate(element) {
        remove(at: idx)
        return element
      }
    }
    return nil
  }
}
0 голосов
/ 04 мая 2018

Вот расширение, которое возвращает массив пропущенных элементов:

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]
0 голосов
/ 04 мая 2018

Это расширение принимает предикат и возвращает элемент, если он соответствует предикату. Также удаляет элемент из массива.

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

TEST:

var array:[Any] = ["a", "b", 1, "c"]
let element = array.popFirstElementWith { (element) -> (Bool) in
    return element is Int
}
print(element!)
print(array)

выход

1
["a", "b", "c"]
0 голосов
/ 04 мая 2018

вы можете использовать Split при условии нарезки вашего массива

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

    var slicedArray:[ArraySlice] = typeList.split { (value) -> Bool in
                return value == YourCondition
            }
print(slicedArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...