API - Application Programming Interface – интерфейс программирования приложений, интерфейс прикладного программирования
Контроль доступа позволяет вам указать, какие данные внутри структур и классов должны быть доступны внешнему миру, и вы можете выбрать четыре модификатора:
- public - это означает, что каждый может читать и писать свойство
- internal - это означает, что только ваш код Swift может читать и записывать свойство. Если вы отправляете свой код в качестве фреймворка для использования другими, они не смогут прочитать свойство
- fileprivate - это означает, что только код Swift в том же файле, что и тип, может читать и записывать свойство
- private - это наиболее строгий вариант, означающий, что свойство доступно только внутри методов, принадлежащих типу или его расширениям
при использовании внутренних модификаторов (internal, fileprivate, private) membership initializer перестает работать, поэтому в структуре обязательно нужно использовать init(var1...) или задавать дефолтное значение
Associated types (Связанные типы)
Красивый термин для протокола, принимающий дженерики
PATs - protocol with associated types
Без ассоциативных данных:
self.count
- Int?
С ассоциативными данными:
self.count!
- Int
Int и Int? - разные данные.
Ассоциативные массивы (словари в Swift или Set) или Hashed Collections.
Соглашение о кодировании в Swift, где переменные начинаются с маленькой и каждое новое слово в переменной пишется с большой: var justForExample: String
- Это называется camel case, потому что немного похоже на горбы верблюда и используется для облегчения чтения слов в именах переменных.
- ✔️ Properties
Переменная, которая считается во время ее вызова.
var investmentPlan: String {
if age < 30 {
return "Shares"
} else {
return "Bonds"
}
}
! Всегда должна быть var ! Всегда после переменной должен быть указан тип ! Всегда должна возвращать это указанный тип
Контекстное меню выглядит вот так:
CLI (Command Line Interface): еще один пример — с командной строкой в Windows или с терминалом для Linux-систем и MacOS. Когда мы вызываем командную строку и пишем в ней различные команды, мы взаимодействуем с операционной системой.
Devops – DEVelopment, OPs – operations
DevOps представляет собой набор методов разработки программного обеспечения, которые сочетают в себе разработку программного обеспечения (Dev) и информационные технологии операций (OPS), чтобы сократить жизненный цикл разработки систем.
решает проблему обновления данных, которую решает SwiftUI. То есть data buinding - это имплементация
GUI (Graphical User Interface): Когда самый обычный пользователь взаимодействует с сайтом или приложением, он пользуется GUI. Все формочки, кнопочки, иконочки, звуки и т.д., которые мы видим или слышим на сайте - это и есть GUI. Т. е. GUI - это графический способ взаимодействия пользователя с сайтом или приложением. Так как пользователи как правило не используют иные способы взаимодействия с программами, у большинства людей есть четкое представление о том, что интерфейс это обязательно что-то про дизайн или графическое отображение. Но как мы только что выяснили, интерфейс - это способ взаимодействия чего-либо с чем-либо.
Параметры функции изменять нельзя, и, чтобы обойти это ограничение, добавим inout-параметр, который допускает изменение. Это тот же указатель в си (*), для передачи переменной в качестве inout необходимо добавить &.
var num1: Int = 1
var char1 = "a"
func changeNumber(num: Int) {
var num = num
num = 2
}
changeNumber(num: num1)
print(num1) // 1
func changeChar(char: inout String) {
char = "b"
}
changeChar(char: &char1)
print(char1) // b
нельзя передавать константы (let) как inout параметр (&my_let)
lazy
свойства Swift позволяют нам отложить создание свойства до его фактического использования, что делает их похожими на вычисляемое свойство. Однако, в отличие от вычисляемого свойства, они сохраняют результат, который вычисляется, так что последующие обращения к свойству не повторяют работу. Это позволяет им обеспечивать дополнительную производительность, когда они не используются (потому что их код никогда не запускается), и дополнительную производительность, когда они используются повторно (поскольку их значение кэшируется).
ленивые свойства всегда объявляются с помощью var
- Модальным называется такое представление, при котором ничего нельзя выполнить, пока оно не будет удалено с экрана (всплывающие окна). Как например всплывающее окно при нажатии на edit в Landmarks
When you present a view modally, the destination view covers the source view and replaces the current navigation stack.
You present a view modally when you want to break out of your app’s normal flow.
- это просто карта например в приложениие Landmarks
Placeholder - подсказка, расположенная внутри каждого поля подписной формы:
-
@State - все то, что изменяется
-
@StateObject
-
@ObservedObject
-
@Publishers
func square(number: Int) {
print(number * number)
}
number - это параметр функции
-
willSet - вызывается когда свойство собирается быть изменененным (до его изменения). В willSet Swift предоставляет вашему коду специальное значение, называемое newValue, которое содержит новое значение свойства.
-
didSet - вызывается когда свойство уже изменено (после его изменения). В didSet вам дается oldValue для представления предыдущего значения.
Пример правильного использования:
struct FishTank {
var capacity: Int
var fishCount: Int {
didSet {
if fishCount >= self.capacity {
capacity = fishCount
print("capacity changed to \(capacity)")
}
}
}
}
var new = FishTank(capacity: 1, fishCount: 2)
new.fishCount = 10 // capacity changed to 10
Семантическое управление версиями
Учитывая номер версии MAJOR.MINOR.PATCH, увеличьте:
- MAJOR - версия при внесении несовместимых изменений API.
- MINOR - версия, когда вы добавляете функциональность с обратной совместимостью.
- PATCH - версия, когда вы исправляете ошибки с обратной совместимостью.
Дополнительные метки для метаданных предварительной версии и сборки доступны как расширения формата MAJOR.MINOR.PATCH.
let name = "Tanya" - полагаться на вывод типа Swift. Без аннотации типов: let name: String = "Tanya"
Когда следует использовать аннотации типов в Swift?
- Swift не может понять, какой тип следует использовать
Обычно такое происходит в более сложном коде. Например, если вы загружали какие-то данные из Интернета и вы знаете их тип, а Swift может не знать это заранее.
- Вы хотите, чтобы Swift использовал тип, отличный от стандартного
var score: Double = 1000; print = 1000.0
- Вы пока не хотите присваивать значение
var name: String
Вариативные функции Swift позволяют нам принимать любое количество параметров одного типа, разделенных запятыми, для этого достаточно написать ...
после его типа. Внутри функции они передаются нам в виде массива, который мы можем индексировать, перебирать и т. Д.
Итак, Int
параметр - это одно целое число, тогда как Int...
это ноль или более целых чисел - потенциально сотни.
Внутри функции Swift преобразует значения, которые были переданы в массив целых чисел, так что вы можете перебирать их по мере необходимости.
func square(numbers: Int...) {
for number in numbers {
print("\(number) squared is \(number * number)")
}
}
square(numbers: 1, 2, 3, 4, 5) // 1 squared is 1 \n 2 squared is 4 \n 3 squared is 9 \n 4 squared is 16 \n 5 squared is 25
print("Haters", "gonna", "hate")
- print() also variadic function
Значение или тип, удовлетворяющий требованию протокола. Отсюда и название Witness Table.
Было: Text(viewModel.showWarning ? AssessmentStrings.totalAssessmentCommentWarning : "")
Сообщение лучше вынести в отдельный var, что бы поддержать атомарность, например
var warning: String {
viewModel.showWarning ? AssessmentStrings.totalAssessmentCommentWarning : ""
}
Рискуя на себя навлечь обвинения в сексизме, таки не удержусь и приведу пример атомарной операции: беременность - операция строго атомарная, всегда есть один и только один отец (всякие генные ухищрения вынесем за скобки).
И наоборот пример неатомарной операции: воспитание ребенка - увы операция неатомарная, ребенок есть к сожалению субъект множества различных несинхронизированных операций над неокрепшей душой ребенка: мама, папа, бабушка, дедушка, зомбоящик, детсад, школа, друзья, подруги и т.д. по списку.
Плавающий баг (гейзенбаг) - ошибка, которая в одних и тех же условиях то воспроизводится, то нет
Кодирование - преобразование данных из удобной для использования информации в форму удобную для передачи, хранения или автоматической переработки.
В Swift выполняет данную роль протокол Encodable
Пример: схема кодирования JSON/XML, ASCII, Азбука Морзе. SOS
- в кодировке Азбуке Морзе ...---...
Декодирование - преобразование данных из закодированного (или зашифрованного) формата обратно в его исходное или полезное представление.
В Swift выполняет данную роль протокол Decodable
Пример: из ...---...
в SOS
Бикодирование - позволяя типу данных быть и кодируемым, и декодируемым.
В Swift выполняет данную роль протокол Codable
Аннулирование/удаление старого/пометки как устаревших или недействительных.
Н/р: Допускается и инвалидация арбитражного соглашения, заключенного в ненадлежащей форме.
"hello, \(name)" - () это интерполяция (возможность помещать переменные внутри ваших строк) - текст может динамически изменяться
extension String.StringInterpolation {
mutating func appandInterpolation(if condition: @autoclosure () -> Bool, _ literal: StringLiteralType {
guard condition() else { return }
appendLiteral(literal)
}
}
let toggle = true
print("Intepolation: \\(if: toggle, "this is true")")
то же самое, что и
print("Intepolation: \\(toggle \? "this is true" \: "") ")
Вывод: 1) Interpolation: this is true 2) Interpolation: this is true
Интерфейс - это совокупность способов, средств, правил и возможностей взаимодействия кого-либо или чего-либо с кем-либо или чем-либо.
Метод - это функция привязанная к типам (структур, протоколов, классов, перечислениям)
protocol TableViewViewModelType {
func numberOfRow() -> Int
}
Отличия метода от функции:
- Методы могут ссылаться на другие свойства и методы внутри этого типа, что означает, что вы можете написать describe() метод для User типа, который печатает имя пользователя, возраст и город;
- Методы не загрязняют пространство имен;
Пространства имен используются для организации кода в логические группы и для предотвращения конфликтов имен, которые могут возникнуть, особенно если ваша база кода включает несколько библиотек.
Таблица - элемент UI, способный отображать большое количество данных используя вертикальный скролл (прокрутку).
Пагинация - механизм постраничного отображения данных, позволяющий подгружать и добавлять в таблицу следующую "порцию" данных при достижении заданого критерия.
Полиномиальное время — это когда время выполнения алгоритма увеличивается с ростом объема данных, но не слишком резко (не так быстро) по мере увеличения входных данных, как в степенной функции, например 𝑛^2
или 𝑛^3
, где n
— это кол-во входных данных.
Алгоритмы с полиномиальным временем, например 𝑂(𝑛) или 𝑂(𝑛^2) более эффективными, чем экспоненциальные, такие как 𝑂(2^𝑛), где время выполнения растёт намного быстрее при увеличении 𝑛 n.
Рекурсия — это метод программирования, при котором функция вызывает саму себя.
Рекуррентная функция (или рекуррентное соотношение) — это математическое определение, которое задаёт значение функции через её предыдущие значения.
Рекурсия часто используется для реализации рекуррентных функций в программировании.
protocol TableViewViewModelType {
var numberOfRow: Int { get }
}
Array[] - []
это сабскрипт
- слишком долгий текст не хочу его читать;
- лучше полный текст не читать, а достаточно прочитать то, что под пометкой TL;DR
- Наличие этой аббревиатуры в письме означает, что информация может быть вам интересна, но не требуется никаких конкретных действий
Хеширование (от англ. hash - рубить в фарш, мешанина) - преобразование информации неограниченной длинны в значение (хеш) фиксированной длинны.
Примеры:
-
MD5:
Входные данные: "example"
Хеш: 1a79a4d60de6718e8e5b326e338ae533
-
SHA-1:
Входные данные: "example"
Хеш: 5af489d8a9b59a0b62fd4d8a1a4e143d105a0985
// класс
class Person {
var name: String
}
let bob = Person()
И Person()
, и bob
являются объектами, но с разной семантикой:
Person() - объект
вызываете конструктор объекта класса Person;bob объект экземпляр
я класса Person;
Без ассоциативных данных:
enum Activity {
case bored
case running
case talking
case singing
}
С ассоциативными данными:
enum Activity {
case bored
case running(destination: String)
case talking(topic: String)
case singing(volume: Int)
}
5.1 Swift Theme | Back To iOSWiki Contents | 5.3 Data Representations Theme Folder