Swift Notes
34 subscribers
22 photos
3 videos
1 file
24 links
Обучающие материалы и полезные заметки по языку программирования Swift. Изначально задумывался, как моя личная записная книжка в процессе обучения. Связаться со мной @clockber
Download Telegram
👨🏼‍💻 Приветствую!

🗄Навигация по каналу Swift Notes

Для поиска материала вам следует указать поисковое слово через хештег

🔹 Swift начальный уровень
#variables
#switch
#conditionals
#loops
#array
#set
#dictionaries
#functions
#structures
#classes
#operators
#forin

🔹 Swift средний уровень
#enumerations
#optionals
#closures
#properties
#protocols
#generics
#ViewController

Грокаем алгоритмы\\ Адитья Бхаргава.
#бинарный поиск

P.S.
онлайн компилятор online.swiftplayground.run/

Рад любой обратной связи, поэтому пишите ваши пожелания, замечания ➡️ @clockber
Опционал #optionals

🔹Когда мы работаем с данными, иногда мы обнаруживаем, что информация для переменной может отсутствовать. Давайте представим, что вы пишете программу, которая отображает первую букву фамилии пользователя.

let firstName = "Peter"
let middleName = "Hubert"
let lastName = "Penn"

🔹Фамилия пользователя в нашем примере “Penn”, поэтому наша программа должна напечатать “P”. Но как насчет пользователя из второго примера?

let firstName = "George"
let middleName = "Michael"
let lastName = ""

🔹Его фамилия - пустая строка, не содержащая никаких символов! Как мы можем найти первую букву, если в его отчестве вообще нет символов?
Настает время применения Опционала. Опционал - параметр представляющий переменную, которая может отсутствовать. Мы можем сказать, что первая буква в отчестве пользователя является опциональным символом. Либо это реальный символ, либо nil, который описывает отсутствие значения.

🔹Опциональные типы содержат либо значение, либо ноль. Необязательный тип определяется знаком вопроса:

var firstLetter: Character?

🔹Начальное значение опционала будет равно nil, пока вы сами не назначите значение:

var firstLetter: Character?
print(firstLetter) // выведет nil
firstLetter = “a”
print(firstLetter) // выведет Optional("a")

🔹nil может быть присвоено только опциональной переменной. Если вы попытаетесь присвоить nil обычной переменной, вы получите ошибку во время компиляции.

var firstLetter: Character = “a”
firstLetter = nil // ERROR: nil' cannot be assigned to type 'Character'
Принудительное раскрытие (разворачивание) опционала / Force Unwrapping Optionals #optionals

🔹Как только вы создадите опциональную переменную, вы захотите попробовать использовать значению внутри. Однако, если вы просто попытаетесь использовать опциональную переменную, вы получите ошибку во время компиляции:

var x = 5
var y: Int? = 2
let sum = x + y // ERROR: Value of optional type 'Int?' must be unwrapped to a value of type 'Int'

🔹Самый простой путь использования значения в опциональной переменной, это использование > ! < оператора, что называется "принудительное раскрытие", мы получаем следующее:

var x = 5
var y: Int? = 2
let sum = x + y!
print(sum) // вывод 7

🔹Но будьте осторожны, если переменная будет иметь параметр nil, программа развалиться:

var x = 5
var y: Int? = nil
let sum = a + b! // Fatal error: Unexpectedly found nil while unwrapping an Optional value
print(sum)

🔹Прежде чем использовать оператор ! , убедитесь что значение опциональной переменной не будет рано nil. В большинстве случаев, что будет правильнее, используется оператор if, наш код принимает следующий вид:

var a = 4
var b: Int? = nil
if b != nil {
let sum = a + b!
print(sum) Prints 7
}
Что такое optional и какие проблемы они решают? #optionals

🔹optional позволяет переменной любого типа представить ситуацию "отсутствие значения". В Objective-C «отсутствие значения» было доступно только в ссылочных типах с использованием специального значения nil. У типов-значений (value types), вроде int или float, такой возможности не было.
Swift расширил концепцию «отсутствия значения» на типы-значения. Переменная optional может содержать либо значение, либо nil, сигнализирующее об отсутствии значения.
В некоторых случаях не получится избежать неявного разворачивания (implicitly unwrapped) optionals. Когда и почему? #optionals

🔹Наиболее частые причины для использования implicitly unwrapped optionals:

когда вы не можете инициализировать свойство, которое не nil в момент создания. Типичный пример — outlet у Interface Builder, который всегда инициализируется после его владельца. В этом особенном случае, если в Interface Builder всё правильно сконфигурировано — вам гарантировано, что outlet не-nil перед его использованием.
чтобы разрешить проблему цикла сильных ссылок, когда два экземпляра классов ссылаются друг на друга и требуется не-nil ссылка на другой экземпляр. В этом случае вы помечаете ссылку на одной стороне как unowned, а на другой стороне используете неявное разворачивание optional.
Внимание! Все способы разворачивания опционалов. #optionals
спойлер: всего их 7!

🔹1. Принудительное развёртывание (forced unwrapping) — небезопасно.

let a: String = x!

🔹2. Неявное развертывание при объявлении переменной — небезопасно.

var a = x!

🔹3. Optional binding — безопасно.

if let a = x {
print("x was successfully unwrapped and is = \(a)")
}

🔹4. Optional chaining — безопасно.

let a = x?.count

🔹5. Nil coalescing operator — безопасно.

let a = x ?? ""

🔹6. Оператор Guard — безопасно.

guard let a = x else {
return
}

🔹7. Optional pattern — безопасно.

if case let a? = x {
print(a)
}
В чём разница между nil и .none? #optionals

🔹 Нет никакой разницы, Optional.none (кратко .none) и nil эквивалентны.
Фактически, следующий оператор вернёт true:

nil == .none

🔹 Использование nil более общепринято и рекомендовано.
Optionals (опционалы) #optionals — это удобный механизм обработки ситуаций, когда значение переменной может отсутствовать. Значение будет использовано, только если оно есть.

p.s: самое мое любимое,когда коротко и ясно :)
Optional bidding
🔹 упрощаем выражение c опционалами #optionals
#optionals

🔹 еще один вариант работы с опционалами, размещаем дефолтное значение после символов ?? и если в переменной будет nil, получим Unknown, если не nil, то значение, как на скрине.