Неявно развернуто необязательное странное поведение с картой - PullRequest
1 голос
/ 21 апреля 2019

Что я обнаружил

Этот вопрос о чем-то, что я заметил немного странно в языке Swift.Я сталкивался с этим поведением, так как это было ошибкой в ​​моем коде.

Если я создал массив для сетки как неявно развернутый необязательный параметр, то map ведет себя странно.Посмотрите на этот код:

let grid: [[Int]]! = [ // May be defined like this if set later on
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]


print(grid.map { $0[0] }!)
// Prints "[1, 2, 3]" (not what I wanted)

print(grid!.map { $0[0] })
// Prints "[1, 4, 7]" (what I wanted)

Я знаю, что строку можно получить, просто набрав grid[0].Тем не менее, я пытаюсь получить столбец.

Я попробовал первый метод выше, который дает только строку вместо столбца.Второй метод сработал и дал столбец.

В чем причина?

Я определил grid как [[Int]]!, что является неявно развернутым необязательным.

  • Почему мне нужно принудительно развернуть grid для правильного использования map?
  • Почему первый метод действует так же, как и возврат строки с использованием grid[0]?

1 Ответ

2 голосов
/ 21 апреля 2019

Существует две версии map: одна работает с массивом, а другая - с опциональными .

Ваш grid является необязательным и даже если это неявно развернутый необязательный (IUO) , он все равно необязательный .Swift будет обрабатывать IUO как необязательный всякий раз, когда это возможно, и принудительно разворачивает значение, только когда требуется развернутый тип.

Из-за этого необязательная версия map используется вместо того, который вы ожидаете.Явно распаковывая grid с !, вы разрешаете использовать нужную версию map.

Как map работает на необязательном ?

Когда карта применяется к необязательно , она применяет замыкание к развернутому значению.Если необязательный равен nil, ничего не происходит.

Итак, grid разворачивается и становится $0, а закрытие возвращает $0[0], который является первой строкойgrid.


Примечание: В Xcode, если вы option нажимаете map в каждом утверждении, вы увидите, что первое говорит:

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

и второе:

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

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