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

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

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 Ответ

0 голосов
/ 12 сентября 2018

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...