Итак, 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
, вероятно, является нежелательной частью, и вторая формулировка, возможно, является однострочной, так что, возможно, это "крепче".