Прервать преобразование, если один из элементов не может быть преобразован в swift - PullRequest
0 голосов
/ 27 сентября 2019

В swift у нас есть функции более высокого порядка, такие как map, filter, Reduce и так далее для массива

Но что, если у меня есть массив, такой как [Any] = [1, 2, 3, "1«].

и я хочу преобразовать этот массив в массив Int.Но так как в массиве есть «1», моя логика заключается в том, чтобы принять весь этот массив неверным, который я сопоставлю с пустым массивом, скажем так.

Как мне сделать это с более высокими функциями в этом случае?

Фильтрация проста

let array: [Any] = [1, 2, 3, "1"]
let filtered = array.compactMap{ $0 as? Int}
/// prints [1, 2, 3]

, но я хочу, чтобы конечный результат был [], а не [1, 2, 3].

Как мне добиться этого, используя функции более высокого порядка?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

Предполагая, что array as? [Int] ?? [] неприменимо (например, вам нужно применить более сложное преобразование), вы можете throw вместо ошибки.

enum ConversionError: Error {
    case notAllValuesWereInts
}

func convertOrThrow(_ input: Any) throws -> Int {
    switch input {
        case let int as Int: return int
        default: throw ConversionError.notAllValuesWereInts
    }
}

let array: [Any] = [1, 2, 3, "1"]
let ints: [Int]
do {
    ints = try array.map(convertOrThrow)
} catch {
    ints = []
}
print(ints)

В таком случае, когда errorиспользуется для управления потоком, не несет никакой полезной информации, вы можете использовать try? для упрощения вещей:

let array: [Any] = [1, 2, 3, "1"]
let ints = (try? array.map(convertOrThrow)) ?? []
0 голосов
/ 27 сентября 2019

Хотя это должно сработать, так как вы просто хотите проверить, является ли массив массивом целых чисел или нет

array as? [Int] ?? []

Но если вы не хотите использовать выше, вас может заинтересоватьв следующем коде

let filtered = array.filter{($0.self as? Int) == nil}.count == 0 ? array as! [Int] : []

Приведенный выше код дает [], если есть какой-либо элемент, который не является Int

0 голосов
/ 27 сентября 2019

CompactMap

Возвращает массив, содержащий ненулевые результаты вызова данного преобразования для каждого элемента этой последовательности.

Таким образом, вы не можете вернуть то, чтовы хотите с помощью compactMap

let array: [Any] = [1, 2, 3, "1"]


for case let element in array {
    if let _ = element as? Int {
        continue
    } else {
        print("\(element) isn't an Int, so array is invalid")
        break
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...