Развертывание с помощью flatMap - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу получить день недели от даты, которая, как я знаю, существует, вот так:

let dayOfWeek =  Calendar.current.dateComponents([.weekday], from: row.date).weekday

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

Мое мнение должно было сделать:

let dayOfWeek = (row.date).compactMap( { Calendar.current.dateComponents([.weekday], from: $0).weekday!
})

Однако это дает мне ошибку "значение типа 'Date' не имеет члена 'compactMap'"

Может кто-нибудь сказать мне, что я делаю неправильно, или как мне исправить это?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Никаких дополнительных опций не требуется. Это просто:

let dayOfWeek = Calendar.current.component(.weekday, from: row.date)

Примечание. flatMap здесь не имеет значения, поскольку row.date не является обязательным. Но даже если бы это было так, стоит отметить, что у метода Optional flatMap его имя не изменилось. Это все еще flatMap. Только Sequence метод этого имени был изменен на compactMap.

См. Swift Evolution 0187: введите Sequence.compactMap(_:)


Итак, это все еще flatMap:

let foo: Int? = 42
let bar: String? = foo.flatMap { i -> String in
    return "The value is \(i)"
}
// Optional("The value is 42")

Обратите внимание, возвращаемое значение является необязательным String?. В вашем примере, похоже, что вы пытаетесь использовать flatMap, чтобы развернуть необязательный, но это не то, для чего flatMap. Это для вызова закрытия, если оно может развернуть foo, но для возврата nil, если оно не может развернуть его. Так что он просто возвращает еще один необязательный (String? в моем примере выше).

flatMap, который был переименован в compactMap в Swift 4.1, представляет собой Sequence представление:

let baz = ["1", "2", "x", "3"]

let qux: [Int] = baz.compactMap { string -> Int? in
    return Int(string) // return integer value if it could convert it, return `nil` if not
}
// [1, 2, 3]

Чтобы сделать это еще более запутанным, по-прежнему flatMap используется с последовательностями:

let letters = ["a", "b", "c"]

let quux = letters.map { Array(repeating: $0, count: 3) }
// [["a", "a", "a"], ["b", "b", "b"], ["c", "c", "c"]]

let quuz = letters.flatMap { Array(repeating: $0, count: 3) }
// ["a", "a", "a", "b", "b", "b", "c", "c", "c"]
0 голосов
/ 29 апреля 2018

Нет необходимости избегать принудительного развертывания в этом случае. Хотя weekday является необязательным, оно никогда не будет nil, если вы специально запросите компонент .weekday.

let dayOfWeek = Calendar.current.dateComponents([.weekday], from: row.date).weekday!
...