Почему я не могу вызвать карту<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
фактически не оценивает необязательный тип, потому что он вложен в другое выражение. Добавляя ()
Я разделил его на другое выражение, вручную сделав его необязательным типом.