Почему я не могу вызвать карту<U>(_ transform: (Wrapped) -> U) -> U? и использовать дополнительные цепочки в то же время?

Я знаю, что необязательные цепочки, как это:

someOptional?.someProperty

в основном

someOptional.map { $0.someProperty }

Тем не менее, я обнаружил, что делать оба одновременно невозможно:

// someOptional?.someProperty evaluates to an optional type, right?
// so the map method should exist!
someOptional?.someProperty.map(someClosure) // can't find "map"

Вот MCVE:

let s: String? = "Hello"
s?.hashValue.map(Double.init)

Я думаю, что писать что-то вроде выше, более читабельно, чем:

s.map { Double($0.hashValue) }

Так что я бы очень хотел, чтобы использовать дополнительные цепочки и map в то же время.

Как мне это сделать?

1 ответ

Решение

Видимо, по какой-то причине завершение первой части в скобках сработало:

(s?.hashValue).map(Double.init)

Я думаю, что это как-то связано с ? имеющий более низкий приоритет, или это необязательное сцепление не работает так же, как другие выражения. Добавление скобок могло вызвать s?.hashValue стать выражением.

Редактировать:

Вот соответствующая выдержка из ссылки Swift:

Если выражение постфикса, которое содержит выражение необязательной цепочки, вложено в другие выражения постфикса, только самое внешнее выражение возвращает необязательный тип. В приведенном ниже примере, когда c не равно nil, его значение разворачивается и используется для оценки.property, значение которого используется для оценки.performAction(). Полное выражение c?.Property.performAction() имеет значение необязательного типа.

Так s?.hashValue фактически не оценивает необязательный тип, потому что он вложен в другое выражение. Добавляя ()Я разделил его на другое выражение, вручную сделав его необязательным типом.

Другие вопросы по тегам