cookie

Ми використовуємо файли cookie для покращення вашого досвіду перегляду. Натиснувши «Прийняти все», ви погоджуєтеся на використання файлів cookie.

avatar

околоiOSный канал: cmd+B, cmd+R

iOS-разработка, мотивация, статьи, мемасики :) ___ Видео материалы, тестовые задания, информация по курсу: YouTube-channel: https://www.youtube.com/c/cmdBcmdR ___ Дополнительные материалы + поддержка YouTube/Telegram канала https://boosty.to/cmdbcmdr

Більше
Рекламні дописи
877
Підписники
+124 години
+77 днів
+9430 днів

Триває завантаження даних...

Приріст підписників

Триває завантаження даних...

Фото недоступнеДивитись в Telegram
🤣 3👍 1
Хотя, возможно, "захватывает" просто в контексте резало слух, потому что в implicit captures я также писал "захватывает по значению" 🙂 https://t.me/ioscmdbcmdr/491
Показати все...
околоiOSный канал: cmd+B, cmd+R

Если неявные захваты (implicit captures) будут осуществляться по ссылке, то явные (explicit captures) - являются захватами по значению. В примере выше, в замыкании closure значение first захватывается по значению, то есть создается одноименная константа внутри замыкания. Это можно записать следующим образом - строка 19 (немного изменил нейминг для лучшего понимания). Теперь существует переменная first в окружающей/глобальной области видимости и константа first(firstСlosure) в области замыкания. first(firstСlosure) в области замыкания никак не зависит от first в окружающей/глобальной области. Именно поэтому в предыдущем примере в консоль выводилось значение «1 4». В это же время second!.value ссылается на переменную second в окружающей/глобальной области видимости. Для того, чтобы убедиться в этом, присвоим first значение nil. В консоле не увидим никаких изменений, deinit не сработал. На first до сих пор ссылается first(firstСlosure) из замыкания. Присвоим nil для значения second. В консоле увидим сообщение…

👍 2
Давайте разбираться Смотрел мок-собес. Там говорили, что «for цикл захватывает массив в стек, таким образом, что он не пересчитывает внутри for цикла». Вроде бы все верно и логично, но слово «захватывает» ввело в некое заблуждение. Решил погуглить... Из документации IteratorProtocol: Whenever you use a for-in loop with an array, set, or any other collection or sequence, you’re using that type’s iterator. Swift uses a sequence’s or collection’s iterator internally to enable the for-in loop language construct. Всякий раз, когда вы используете цикл for-in с массивом, набором или любой другой коллекцией или последовательностью, вы используете итератор этого типа. Swift использует внутренний итератор последовательности или коллекции, чтобы включить языковую конструкцию цикла for-in. Также мы знаем, что массив имеет семантику value type + COW. Лезем в доку makeIterator() func makeIterator() -> IndexingIterator<Self> makeIterator возвращает IndexingIterator IndexingIterator перебирает элементы коллекции, сохраняя ее и текущий индекс итерации. Реализация. Из всего этого мы можем сделать вывод, что for-in для перебора использует копию коллекции. Значит создается 2 массива(в нашем случае) : - массив, по которому выполняется итерация - массив, в котором происходит мутация. И в теле for-in мы обращаемся именно к нему. Переходим к примеру.

var array = [1, 2, 3, 4, 5]

for index in array.indices {
    if array[index].isMultiple(of: 2) {
        array.remove(at: index)
    }
    print(array)
}

//Консоль
//[1, 2, 3, 4, 5]
//[1, 3, 4, 5]
//[1, 3, 5]
//Swift/ContiguousArrayBuffer.swift:600: Fatal error: Index out of range
for-in определяет, что необходимо сделать 5 операций (индексы с 0 до 4) 1 итерация (индекс 0) «1» нечетное число, поэтому в консоли видим [1, 2, 3, 4, 5] 2 итерация (индекс 1) «2» четное, удаляем, в консоли - [1, 3, 4, 5] 3 итерация (индекс 2) Сейчас по индексу 2 находится «4» - четное - удаляем. В консоли [1, 3, 5] 4 итерация (индекс 3) Массив array на этот момент состоит из [1, 3, 5], обращаясь по индексу 3 ловим «Index out of range» Такой подход объясняет, как в одном из примеров выше получилось [1, 3, 4] Ставь лайк, если было интересно 👍 Пиши коммент, если есть что добавить/исправить 🥸
Показати все...
👍 15
Выведется 3 в консоль?Anonymous voting
  • Да
  • Нет
0 votes
👍 2
Фото недоступнеДивитись в Telegram
Если что, в 4 строке это равенство ==
Показати все...
👍 2
Последнее сообщение в консоли перед "Index out of range":Anonymous voting
  • [1, 2, 3, 4, 5]
  • [1, 3, 4, 5]
  • [1, 3, 5]
  • [1]
0 votes
👍 1
Фото недоступнеДивитись в Telegram
👍 1
Что выведется в консоль?Anonymous voting
  • [1, 2, 3, 4, 5]
  • [1, 3, 4]
  • [1, 3, 5]
  • [1, 4, 5]
  • error
0 votes
👍 1
Фото недоступнеДивитись в Telegram
👍 1
Фото недоступнеДивитись в Telegram