Ошибки — это круто! 🔥
Даже если в тесте ответил неправильно — это хорошо! Потому что:
✔️ Учишься — теперь знаешь, как делать верно.
✔️ Запоминаешь — ошибки помогают информации "застревать" в голове.
✔️ Растёшь — каждый промах приближает к успеху.
Главное — не бояться ошибаться. Ведь именно так рождается опыт! 💪
Даже если в тесте ответил неправильно — это хорошо! Потому что:
✔️ Учишься — теперь знаешь, как делать верно.
✔️ Запоминаешь — ошибки помогают информации "застревать" в голове.
✔️ Растёшь — каждый промах приближает к успеху.
Главное — не бояться ошибаться. Ведь именно так рождается опыт! 💪
❤4💯3⚡2
Как сделать функцию доступной только внутри текущего файла?
Anonymous Quiz
29%
A. private
8%
B. internal
63%
C. fileprivate
0%
D. static
❤1👍1
Что такое сигнатура функции?
Anonymous Quiz
20%
A. Её тело
3%
B. Возвращаемое значение
69%
C. Имя, параметры и возвращаемый тип
9%
D. Только параметры
❤4
Test: 🧪
Что такое замыкание в Swift❓🤔
Что такое замыкание в Swift❓🤔
Anonymous Quiz
4%
A) Тип, который используется только внутри функций
4%
B) Класс, который реализует протокол
0%
C) Структура, содержащая только свойства
92%
D) Функция без имени, которая может захватывать значения из окружающего контекста
❤3👍1
Bei Code 🍏
Test: 🧪
Что такое замыкание в Swift❓🤔
Что такое замыкание в Swift❓🤔
Пример кода к этому вопросу 👨💻
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
import Foundation
// Функция возвращает замыкание (closure), которое умножает захваченное значение
func makeMultiplier(by factor: Int) -> () -> Int {
var total = 1 // Локальная переменная, которая будет захвачена замыканием
// Замыкание, которое захватывает total и factor
let closure = {
total *= factor // Умножаем total на factor и сохраняем результат
return total // Возвращаем текущее значение total
}
return closure // Возвращаем замыкание
}
// Создаём замыкание, которое будет умножать на 2
let multiplyBy2 = makeMultiplier(by: 2)
// Каждый вызов multiplyBy2() увеличивает значение total и возвращает его
print(multiplyBy2()) // 2 (1 * 2)
print(multiplyBy2()) // 4 (2 * 2)
print(multiplyBy2()) // 8 (4 * 2)
❤2👍2
Test: 🧪
Что используется для предотвращения захвата сильной ссылки на объект в замыкании❓🤔
Что используется для предотвращения захвата сильной ссылки на объект в замыкании❓🤔
Anonymous Quiz
4%
A) [let self]
0%
B) [strong self]
96%
C) [weak self]
0%
D) [var self]
❤2👍1
Bei Code 🍏
Test: 🧪
Что используется для предотвращения захвата сильной ссылки на объект в замыкании❓🤔
Что используется для предотвращения захвата сильной ссылки на объект в замыкании❓🤔
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
class A {
var closure: (() -> Void)?
func setup() {
// Замыкание захватывает self сильно (по умолчанию)
closure = {
print("B is doing something: \(String(describing: self))")
}
}
deinit {
print("A deallocated ❌") // Не вызовется из-за retain cycle
}
}
// Создаём объект A
var a: A? = A()
a?.setup()
// Обнуляем ссылку — объект не освобождается
a = nil // ❌ deinit не вызывается — утечка памяти!
class B {
var closure: (() -> Void)?
func setup() {
// Используем [weak self], чтобы избежать цикла сильных ссылок
closure = { [weak self] in
print("B is doing something: \(String(describing: self))")
}
}
deinit {
print("B deallocated") // Вызывается — всё хорошо!
}
}
// Создаём объект B
var b: B? = B()
b?.setup()
// Обнуляем ссылку — объект освобождается, замыкание не удерживает его сильно
b = nil // deinit вызывается — утечки нет
❤1👍1
Test: 🧪
Что делает ключевое слово @escaping в определении параметра-замыкания❓🤔
Что делает ключевое слово @escaping в определении параметра-замыкания❓🤔
Anonymous Quiz
8%
A) Гарантирует, что замыкание выполнится сразу
4%
B) Помечает замыкание как optional
81%
C) Позволяет замыканию выходить за пределы тела функции
8%
D) Отменяет захват значений
❤3👍1
Bei Code 🍏
Test: 🧪
Что делает ключевое слово @escaping в определении параметра-замыкания❓🤔
Что делает ключевое слово @escaping в определении параметра-замыкания❓🤔
Пример кода к этому вопросу 👨💻
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
// Функция без @escaping — замыкание вызывается сразу
func runNow(action: () -> Void) {
print("Сейчас выполню:")
action()
}
runNow {
print("→ Замыкание внутри runNow")
}
// Функция с @escaping — замыкание выполнится позже
func runLater(action: @escaping @Sendable () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print("Через 1 секунду:")
action()
PlaygroundPage.current.finishExecution()
}
}
runLater {
print("→ Замыкание внутри runLater (отложено)")
}
❤1👍1
Привет, друзья👋
Краткий обзор приложения написанного на SwiftUI, которое я делаю когда появляется свободная минутка🙂.
https://youtu.be/ODtS2l1Q-l8
Краткий обзор приложения написанного на SwiftUI, которое я делаю когда появляется свободная минутка🙂.
https://youtu.be/ODtS2l1Q-l8
YouTube
🎲 Как кинуть жребий на iPhone — 🎯 Random Picker App на SwiftUI | 📱 iOS жеребьёвка
В этом видео покажу, как работает моё iOS-приложение для жеребьёвки, написанное на SwiftUI. С его помощью можно быстро и честно выбрать победителя, определить, кто ходит первым в настольной игре (Монополия, Катан, UNO), или решить спор в компании. Приложение…
❤3❤🔥2🔥1
Test: 🧪
Что делает capture list в замыкании❓🤔
Что делает capture list в замыкании❓🤔
Anonymous Quiz
9%
A) Разрешает перегрузку замыканий
86%
B) Управляет тем, как переменные захватываются замыканием
0%
C) Заменяет параметры по умолчанию
5%
D) Объявляет анонимные функции
❤2👍1
Bei Code 🍏
Test: 🧪
Что делает capture list в замыкании❓🤔
Что делает capture list в замыкании❓🤔
Пример кода к этому вопросу 👨💻
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
import Foundation
final class Downloader: Sendable {
// Замыкание, которое вызывается после завершения "загрузки"
var onComplete: (() -> Void)?
func load() {
// Эмулируем асинхронную работу с небольшой задержкой (0.5 сек)
// DispatchQueue.global() запускает код в фоновом потоке
DispatchQueue.global().asyncAfter(deadline: .now() + 0.5) { [weak self] in
// [weak self] — захватываем self слабо, чтобы избежать retain cycle
// Без weak self объект Downloader мог бы остаться в памяти, даже если все ссылки на него исчезнут
self?.onComplete?() // безопасно вызываем замыкание, если self ещё жив
}
}
}
// Тест
let downloader = Downloader()
downloader.onComplete = {
print("Download finished!") // Этот код выполнится через 0.5 сек
}
downloader.load()
❤2👍1
Test: 🧪
Может ли замыкание возвращать значение❓🤔
Может ли замыкание возвращать значение❓🤔
Anonymous Quiz
4%
A) Нет, замыкания всегда возвращают Void
96%
B) Да, оно может возвращать любой тип
0%
C) Только Int
0%
D) Только если замыкание внутри класса
❤2
Bei Code 🍏
Test: 🧪
Может ли замыкание возвращать значение❓🤔
Может ли замыкание возвращать значение❓🤔
Пример кода к этому вопросу 👨💻
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
import Foundation
// Замыкание, которое принимает два Int и возвращает их сумму (Int)
let sumClosure: (Int, Int) -> Int = { a, b in
return a + b
}
// Замыкание, которое принимает имя и возвращает приветствие (String)
let greetingClosure: (String) -> String = { name in
return "Привет, \(name)!"
}
// Замыкание без параметров, которое возвращает текущее время (Date)
let dateClosure: () -> Date = {
return Date()
}
// Примеры использования
let result1 = sumClosure(5, 7) // 12
let result2 = greetingClosure("Sergei") // "Привет, Sergei!"
let result3 = dateClosure() // Текущая дата и время
print(result1)
print(result2)
print(result3)
❤1👍1
Что произойдёт, если замыкание сильно захватывает self в классе❓🤔
Anonymous Quiz
11%
A) Компилятор вызовет ошибку
86%
B) Возможна утечка памяти (retain cycle)
0%
C) self станет nil
4%
D) Ничего, это безопасно
👍3❤2
Test: 🧪
Может ли замыкание быть передано как параметр функции❓🤔
Может ли замыкание быть передано как параметр функции❓🤔
Anonymous Quiz
4%
A) Нет, только функции могут передаваться
92%
B) Да, это обычная практика
0%
C) Только если оно async
4%
D) Только с модификатором mutating
👍3💯1
Test: 🧪
Можно ли сохранить замыкание в переменной❓🤔
Можно ли сохранить замыкание в переменной❓🤔
Anonymous Quiz
4%
A) Только внутри функций
91%
B) Да, замыкание — это тип
4%
C) Нет, замыкание нельзя присваивать
0%
D) Только если оно возвращает Void
❤3👍1
Bei Code 🍏
Test: 🧪
Можно ли сохранить замыкание в переменной❓🤔
Можно ли сохранить замыкание в переменной❓🤔
Пример кода к этому вопросу 👨💻
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
Код, чтобы просто взять и Ctrl+C Ctrl+V 👇
import Foundation
// Переменная объявлена вне функции (пока без значения)
var operation: ((Int, Int) -> Int)?
// Функция, внутри которой мы присваиваем переменной замыкание
@MainActor func setupClosure() {
// Присваиваем замыкание в переменную
operation = { a, b in
return a + b
}
print("Замыкание присвоено переменной 'operation'")
}
// Сначала вызываем настройку
setupClosure()
// Теперь можно использовать переменную с замыканием
if let op = operation {
let result = op(4, 6)
print("4 + 6 = \(result)") // 4 + 6 = 10
}
❤3
Test: 🧪
Как вызвать замыкание, сохранённое в переменной closure❓🤔
Как вызвать замыкание, сохранённое в переменной closure❓🤔
Anonymous Quiz
9%
A) call(closure)
91%
B) closure()
0%
C) invoke closure
0%
D) execute(closure)
❤3👍1