околоiOSный канал: cmd+B, cmd+R
iOS-разработка, мотивация, статьи, мемасики :) ___ Видео материалы, тестовые задания, информация по курсу: YouTube-channel: https://www.youtube.com/c/cmdBcmdR ___ Дополнительные материалы + поддержка YouTube/Telegram канала https://boosty.to/cmdbcmdr
نمایش بیشتردر حال بارگیری داده...
Find out who reads your channel
This graph will show you who besides your subscribers reads your channel and learn about other sources of traffic.پست ها | بازدید ها | به اشتراک گذاشته شده | ديناميک بازديد ها |
01 Media files | 225 | 3 | Loading... |
02 Хотя, возможно, "захватывает" просто в контексте резало слух, потому что в implicit captures я также писал "захватывает по значению" 🙂
https://t.me/ioscmdbcmdr/491 | 270 | 1 | Loading... |
03 Давайте разбираться
Смотрел мок-собес. Там говорили, что «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]
Ставь лайк, если было интересно 👍
Пиши коммент, если есть что добавить/исправить 🥸 | 262 | 4 | Loading... |
04 Media files | 247 | 0 | Loading... |
05 Если что, в 4 строке это равенство == | 243 | 0 | Loading... |
06 Media files | 244 | 0 | Loading... |
07 Media files | 229 | 0 | Loading... |
08 Media files | 230 | 0 | Loading... |
09 Media files | 240 | 0 | Loading... |
10 Media files | 7 | 0 | Loading... |
11 Media files | 247 | 0 | Loading... |
12 Media files | 249 | 0 | Loading... |
13 Можно долго спорить на тему того, все ли должен знать джун, что его спрашивают на собеседовании, а можно взять и подготовиться :)
Если вы не знаете, почему у двух практически одинаковых структур разный размер, подготовил для вас пост:
[27]iOS Interview: MemoryLayout
П.С. Там одна подписка со скидкой осталась 😉 | 293 | 1 | Loading... |
14 Media files | 294 | 0 | Loading... |
15 Media files | 283 | 0 | Loading... |
16 Media files | 279 | 0 | Loading... |
17 Для прикола прошел тест на каком-то первом попавшемся сайте :)
Потратьте минуту и скиньте свои результаты :)
Заодно укажите как вы печатаете.
Понятно, что слова рандомятся, но хотя бы примерно :) | 285 | 2 | Loading... |
18 Media files | 279 | 0 | Loading... |
19 А теперь серьезный опрос :)
Заметил, что я в основном печатаю 2 пальцами каждой руки (указательный + средний).
Крайне редко на помощь приходит безымянный палец.
А как это происходит у вас? | 281 | 1 | Loading... |
20 Combine с нуля
Познакомились с основами работы с сетью
Переходим в новый раздел.
По такому поводу скидка 30% на 3 подписки. | 290 | 1 | Loading... |
21 Изменения за неделю:
1. Combine с нуля
- Combine[16]: Data Task Publisher
- Combine[17]: Decoding JSON
- Combine[18]: Retrying Failed Requests
2. YouTube
- Xcode Shorcuts
3. Перенес на boosty блок "Фундаментальные знания Swift"
- Доступ к материалам и тестам - 2200
- 12 домашних заданий с видеофидбеком - 3000р
- 4 персональных созвона - 3000р
_
Полное содержание boosty аккаунта здесь :) | 299 | 0 | Loading... |
22 Рассмотрим, на мой взгляд, «несерьезные» алгоритмы сортировки 🙂
1. Stalin sort/dictator sort/ trump sort
Само название сортировки говорит о том, что к ней нельзя относится серьезно.
Хотя на собеседованиях спрашивают про баблсорт. С таким же успехом можно спрашивать и Сталин сорт
Суть сортировки достаточно проста: «Не нравится алгоритмическая секция на собеседованиях? Иди на завод».
Разберем по пунктам:
⁃ Проходимся по последовательности слева направо
⁃ Если элемент больше или равен предыдущему - оставляем в списке
⁃ Если элемент меньше предыдущего - удаляем
При такой сортировке сложность O(n), а то что некоторые элементы стали иноагентами это мелочь.
Конечно, мы можем записать удаленные элементы в массив Мизулиной, а потом взять каждого поочередно и прогнать по такой же схеме по «отсортированному массиву».
В итоге мы получим отсортированный массив, но с временной сложностью O(n^2)
2. Bogo sort
Вот что говорит Википедия по поводу этой сортировки:
Bogosort (от амер. комп. жарг. bogus — неработоспособный, нефункциональный, бесполезный) — неэффективный алгоритм сортировки, используемый только в образовательных целях и противопоставляемый другим, более реалистичным алгоритмам.
Стало даже немного обидно за нее...
Суть алгоритма:
1. Проверяем последовательность, которая пришла на вход, на «отсортированность».
2. Если последовательность отсортированная - круто! Если нет - перемешаем все элементы и возвращаемся к пункту 1
Попахивает коммивояжером с факториальной сложностью 🙂
3. Thanos sort
Название интригует и сразу отправляет во вселенную Марвел.
Щелчок Таноса уничтожил 50 % всех живых существ во Вселенной. Мемориалы «павшим» жертвам были воздвигнуты по всей вселенной. Процесс уничтожения половины жизни во Вселенной представлял собой полный распад существа на мельчайшие частицы, представляющие собой пыль или прах, без дальнейшего восстановления.
Если у вас при виде «50%» возникли мысли о бинарном поиске, быстрой сортировке или сортировке слиянием, и вы полны надежды адекватной сортировки за O(n*log n) - забудьте…
Хотя все очень похоже на быструю сортировку и сортировку слиянием
Сортировка Таноса заключается в следующем:
⁃ Вычисление среднего арифметического значения среди элементов
⁃ Сравнение элементов с «опорным» элементом (значение из пункта 1).
Значения меньше - влево, значения больше - вправо
⁃ Рекурсивный повтор действий для левой и правой половины последовательности
Что по сложности?
Повторение судьбы быстрой сортировки: худший случай - O(n^2)
Пока гуглил, видел вариации сортировки Таноса через удаление половины массива, пока массив не станет отсортированный, но это уже дичайшая дичь (хотя полностью оправдывает название и суть). Пусть лучше будет через среднее арифметическое 🙂
Хотя при таком подходе быстрая сортировка и сортировка слиянием, тоже станет разновидностью сортировки Таноса.
Ну а на этом все, всем хороших выходных 🙂 | 319 | 5 | Loading... |
23 Media files | 309 | 1 | Loading... |
24 Apple список 100 лучших альбомов по версии Apple Music:
100. Body Talk — Robyn
99. Hotel California — Eagles
98. ASTROWORLD — Travis Scott
97. Rage Against the Machine — Rage Against the Machine
96. Pure Heroine — Lorde
95. Confessions — USHER
94. Untrue — Burial
93. A Seat at the Table — Solange
92. Flower Boy — Tyler, The Creator
91. Listen Without Prejudice Vol. 1 — George Michael
90. Back in Black — AC/DC
89. The Fame Monster — Lady Gaga
88. I Put a Spell on You — Nina Simone
87. Blue Lines — Massive Attack
86. My Life — Mary J. Blige
85. Golden Hour — Kacey Musgraves
84. Doggystyle — Snoop Dog
83. Horses — Patty Smith
82. Get Rich or Die Tryin’ — 50 Cent
81. After the Gold Rush — Neil Young
80. The Marshall Mathers LP — Eminem
79. Norman F*g Rockwell! — Lana Del Rey
78. Goodbye Yellow Brick Road — Elton John
77. Like a Prayer — Madonna
76. Un Verano Sin Ti — Bad Bunny
75. Supa Dupa Fly — Missy Elliott
74. The Downward Spiral — Nine Inch Nails
73. Aja — Steely Dan
72. SOS — SZA
71. Trans-Europe Express — Kraftwerk
70. Straight Outta Compton — N.W.A
69. Master of Puppets — Metallica
68. Is This It — The Strokes
67. Dummy — Portishead
66. The Queen Is Dead — The Smiths
65. 3 Feet High and Rising — De La Soul
64. Baduizm — Erykah Badu
63. Are You Experienced — The Jimi Hendrix Experience
62. All Eyez on Me — 2Pac
61. Love Deluxe — Sade
60. The Velvet Underground & Nico — The Velvet Underground & Nico
59. AM — Arctic Monkeys
58. (What’s the Story) Morning Glory? — Oasis
57. Voodoo — D’Angelo
56. Disintegration — The Cure
55. ANTI — Rihanna
54. A Love Supreme — John Coltrane
53. Exile on Main St. — The Rolling Stones
52. Appetite for Destruction — Guns N’ Roses
51. Sign O’ the Times — Prince
50. Hounds of Love — Kate Bush
49. The Joshua Tree — U2
48. Paul’s Boutique — Beastie Boys
47. Take Care — Drake
46. Exodus — Bob Marley & The Wailers
45. Homogenic — Björk
44. Innervisions — Stevie Wonder
43. Remain in Light — Talking Heads
42. Control — Janet Jackson
41. Aquemini — OutKast
40. I Never Loved a Man the Way I Love You — Aretha Franklin
39. Illmatic — Nas
38. Tapestry — Carole King
37. Enter the Wu-Tang (36 Chambers) — Wu-Tang Clan
36. BEYONCÉ — Beyoncé
35. London Calling — The Clash
34. It Takes a Nation of Millions to Hold Us Back — Public Enemy
33. Kid A — Radiohead
32. Ready to Die — The Notorious B.I.G.
31. Jagged Little Pill — Alanis Morisette
30. WHEN WE ALL FALL ASLEEP, WHERE DO WE GO? — Billie Eilish
29. The Low End Theory — A Tribe Called Quest
28. The Dark Side of the Moon — Pink Floyd
27. Led Zeppelin II — Led Zeppelin
26. My Beautiful Dark Twisted Fantasy — Kanye West
25. Kind of Blue — Miles Davis
24. The Rise and Fall of Ziggy Stardust and the Spiders From Mars — David Bowie
23. Discovery — Daft Punk
22. Born to Run — Bruce Springsteen
21. Revolver — The Beatles
20. Pet Sounds — The Beach Boys
19. The Chronic — Dr. Dre
18. 1989 (Taylor’s Version) — Taylor Swift
17. What’s Going On — Marvin Gaye
16. Blue — Joni Mitchell
15. 21 — Adele
14. Highway 61 Revisited — Bob Dylan
13. The Blueprint — JAY-Z
12. OK Computer — Radiohead
11. Rumors — Fleetwood Mac
10. Lemonade — Beyoncé
9. Nevermind — Nirvana
8. Back to Black — Amy Winehouse
7. good kid, m.A.A.d city (Deluxe Version) — Kendrick Lamar
6. Songs in the Key of Life — Stevie Wonder
5. Blonde — Frank Ocean
4. Purple Rain — Prince & The Revolution
3. Abbey Road — The Beatles
2. Thriller — Michael Jackson
1. The Miseducation of Lauryn Hill — Lauryn Hill | 312 | 1 | Loading... |
25 Написал туториал как оплатить 👨💻 Apple Developer Program из России
🐤 https://sparrowcode.io/ru/tutorials/pay-for-apple-developer-account-from-ru
Если Apple ID в регионе РФ, то не получится создать покупки и подписки. Что делать, если нужны ин-апы, тоже разобрал в туториале | 195 | 7 | Loading... |
26 Скажем Ивану огромнейшее спасибо 💪 | 355 | 0 | Loading... |
27 На Youtube выложил видел с горячими кнопками 🔥 | 466 | 5 | Loading... |
28 СМИ: РЖД переведёт всех проводников на российские смартфоны на базе ОС «Аврора»
А вам давно говорились, бросайте гейский софт 🙂
https://habr.com/ru/news/815487/ | 475 | 3 | Loading... |
29 Наконец-то я перенес блок с фундаментальными знаниями Swift 🥳
Обратите внимание, при оформлении подписки Course, вы получаетет доступ и к фундаментальным знаниями и к паттерну "Координатор".
"Базовые знания" могут быть полезны для тех, кто только начал изучать Swift или же хочет проверить и закрепить свои знания.
В стоимость подписки входят видео-материалы + текстовые конспекты аналогичные по наполняемости.
Сам выбираешь удобный для себя формат или комбинируешь для максимального закрепления результата.
В подписку входят тесты по каждой теме.
В "Базовые знания" входит 26 тем.
Список тем, смотри здесь!
П.С. Домашние задания и созвоны опциональны (за доп плату)
П.П.С. В честь такого события скидка 20% на 1 подписку :) | 426 | 0 | Loading... |
30 Media files | 340 | 0 | Loading... |
31 struct Car {
let speed: Int
let color: String
init(speed: Int, color: String) {
self.speed = speed
self.color = color
}
}
extension Car {
init(color: String) {
self.color = color
self.speed = 0
}
}
var car = Car(color: "red")
print(car.color) | 323 | 0 | Loading... |
32 Media files | 322 | 0 | Loading... |
33 Перехожу к последнему разделу "Extensions"
Немного криво вставил код 🙂
class Car {
let speed: Int
let color: String
init(speed: Int, color: String) {
self.speed = speed
self.color = color
}
}
extension Car {
init(color: String) {
self.color = color
self.speed = 0
}
}
var car = Car(color: "red")
print(car.color) | 330 | 0 | Loading... |
34 Перехожу к последнему разделу "Extensions"
Немного криво вставил код 🙂 | 2 | 0 | Loading... |
35 Media files | 3 | 0 | Loading... |
36 Перехожу к последней теме: "Extensions" 🙂
class Car {
let speed: Int
let color: String
init(speed: Int, color: String) {
self.speed = speed
self.color = color
}
}
extension Car {
init(color: String) { //error
self.color = color
self.speed = 0
}
}
var car = Car(color: "red")
print(car.color) | 2 | 0 | Loading... |
37 Media files | 330 | 1 | Loading... |
38 protocol Car {
var speed: Int { get set }
func drive()
}
struct Lada: Car {
var speed: Int = 0
mutating func drive() {
speed += 10
}
} | 328 | 1 | Loading... |
39 Media files | 330 | 0 | Loading... |
40 Media files | 325 | 0 | Loading... |
Если неявные захваты (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. В консоле увидим сообщение…
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]
Ставь лайк, если было интересно 👍
Пиши коммент, если есть что добавить/исправить 🥸- [1, 2, 3, 4, 5]
- [1, 3, 4, 5]
- [1, 3, 5]
- [1]
- [1, 2, 3, 4, 5]
- [1, 3, 4]
- [1, 3, 5]
- [1, 4, 5]
- error