Последний Свифт, компактная карта в каждом конкретном случае? - PullRequest
0 голосов
/ 04 февраля 2020

Я делаю это,

let x = results.compactMap {
    if case .person (let P) = $0 { return P }
    else { return nil }
}

x это [Person], очевидно, что результаты это что-то вроде

enum ResultItem: Decodable {
    case person(Person)
    case cat(Cat)
    case budgie(Budgie)

В любом случае я делаю это,

let x = results.compactMap {
    if case .person (let P) = $0 { return P }
    else { return nil }
}

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

Go для этого ...

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Итак, results - это массив ResultItem, и идея состоит в том, чтобы извлечь полезные данные только из тех, которые являются Persons?

Я не знаю, является ли это "более плотным", но я, вероятно, сделал бы это с for case let:

let arr : [ResultItem] = // ...
var persons = [Person]()
for case let .person(p) in arr { persons.append(p) }

Вы можете разумно возразить: «Но я не хочу, чтобы persons было var». Да, я знаю, что ты чувствуешь. Поэтому иногда я говорю это вместо этого (словеснее, конечно):

let persons : [Person] = 
    arr.reduce(into: []) {if case let .person(p) = $1 {$0.append(p)}}

Они оба действительно могут сказать одно и то же: добавляйте, только если вы можете извлечь человека. Конечно, вы в некотором роде делаете то же самое, но круговое движение return nil в compactMap, вероятно, является нежелательной частью, и вторая формулировка, возможно, является однострочной, так что, возможно, это "крепче".

1 голос
/ 04 февраля 2020

возможно определить

func person(_ r: ResultItem)->Person? {
    if case .person (let P) = r { return P }
    else { return nil }
}

и следующий компакт. по крайней мере, мне легче читать ...

let persons = items.compactMap(person)

или даже лучше

extension ResultItem {
    static func person(_ r: ResultItem)->Person? {
        if case .person (let P) = r { return P }
        else { return nil }
    }
}

и

let persons = items.compactMap(ResultItem.person)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...