Типы могут быть вложенными (nested). Класс или структура может содержать определение другого класса или структуры. Например:
class User{
var name: String
var age: Int
var profile: UserProfile
struct UserProfile{
var login: String
var password: String
func authenticate(_ login: String, _ password: String) -> Bool{
return self.login == login && self.password == password
}
}
init(name: String, age: Int, login: String, password: String){
self.name = name
self.age = age
self.profile = UserProfile(login: login, password: password)
}
}
var tom = User(name: "Tom", age: 23, login: "querty", password: "12345")
print(tom.profile.authenticate("sdf", "456")) // false
print(tom.profile.authenticate("querty", "12345")) // trueЗдесь структура UserProfile является вложенной. Вложенные типы также могут определять свойства, методы, инициализаторы. А внешний тип может хранить объект вложенного типа.
Также вложенные типы могут использовать вне своего типа, в котором они определены. В этом случае к ним необходимо обращаться через имя внешнего типа:
var profile = User.UserProfile(login: "ssdf", password: "345")
var isLoged = profile.authenticate("ssdf", "345") // true
#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Optional (необязательный) означает, что переменная или данные могут быть равны нулю, и вы обрабатываете эти нулевые значения с помощью некоторых ключевых слов Swift.
Если вы обнаруживали
nil и развертывали его с помощью optional для обработки, это значит, что вы знакомы с таким типом переменных.Давайте рассмотрим сложные аспекты
optional в Swift, которые всех сбивают с толку.? против !Есть два способа сделать переменную optional с помощью
? и !, но каждый из них имеет разное значение.Когда вы делаете любую переменную необязательной (optional) с помощью
?, это означает, что вам также придётся обрабатывать значение nil.var name: String?
if let name = name {
print("Hello, \(name)")
} else {
print("No name found.")
}
Здесь мы использовали
if-let для обработки имени. Если имя равно nil, выполняется блок else; в противном случае выполняется блок if.Когда вы создаёте переменную с помощью
!, это означает, что вам не нужно обрабатывать значение nil.var userId: String!
print(userId.count)
Код выполняется успешно, но если значение равно нулю, приложение аварийно завершает работу.
Примечание. Используйте
!, если вы уверены, что заданное значение не будет равно нулю, даже если оно объявлено как optional.С помощью цепочки необязательных переменных (?) вы можете безопасно выполнить код с необязательной переменной.
let size = user?.name.count
Этот код работает нормально, даже если имя равно нулю. Всё выражение возвращает
nil, но не приводит к крешу.Необязательная цепочка (Optional Chaining) не остановит выполнение программы, если значение равно нулю. Взгляните на этот пример:
user?.logout()
print("Done!")
Если
user равен нулю, функция выхода из системы не будет вызвана, но приведенный ниже код будет выполнен.if let — не всегда лучший выборif-let полезен для управления нулевыми значениями, но иногда он может сделать код более сложным и запутанным.if let name = data?.name {
if let city = data?.address?.city {
print("\(name) lives in \(city)")
}
}Это затрудняет чтение вложенного кода.
Лучший способ:
guard let name = data?.name,
let city = data?.address?.city else {
return
}
print("\(name) lives in \(city)")
Еще лучший способ:
let city = data?.address?.city ?? "Unknown City"
??)Вы уже знакомы с таким кодом:
var name: String? = "Jayant"
Переменная
name имеет строковое значение или может быть равна нулю.Но видели ли вы что-то подобное?
let value: String?? = "Jayant"
Это называется Double Optional (
??). Читается как Optional(optional("Jayant")).Основной вариант использования — когда вы возвращаете необязательный параметр из функции и присваиваете эту функцию любой переменной, которая также возвращает optional параметр.
func getName() -> String? {
return nil
}
let name: String?? = getName()Здесь функция
getName() возвращает String?, а при назначении имени вы пишете String??, что означает optional, содержащую другую optional строку.Взгляните на этот код:
var names: [String]? = []
На первый взгляд кажется, что это просто пустой массив, но на самом деле это optional массив, содержащий внутри себя пустой массив.
Необязательный массив может находиться в различных состояниях.
var names: [String]? = nil // it's not an array
var names: [String]? = [] // Array exists, but it’s empty
var names: [String]? = ["Jayant", "Neha"] // Array with values
Давайте посмотрим, что произойдет, если вы это проверите:
var names: [String]? = []
if names != nil {
print("Array exists")
}
// output ---> Array exists
Как видите, массив существует и пуст.
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
При создании интерфейсов на основе данных в SwiftUI вам часто будет требоваться визуализировать числовое значение или управлять им. Для этой цели можно использовать три встроенных представления —
Gauge, ProgressView, и Slider.Хотя на первый взгляд они могут показаться похожими, они существенно различаются по назначению и способу взаимодействия.
🔹 Индикатор — отображение значения в диапазоне
Представленный в iOS 16 вид
Gauge предназначен для отображения значения, а не для того, чтобы пользователи могли его изменять.Он идеально подходит для случаев, когда вам нужен индикатор только для чтения, например для отображения уровня заряда батареи, температуры или загрузки процессора.
Gauge(value: currentTemp, in: 0...100) {
Text("Temperature")
} currentValueLabel: {
Text("\(Int(currentTemp))°C")
}
.tint(.orange)
Gauge(value: currentTemp, in: 0...100) {
Text("Temperature")
} currentValueLabel: {
Text("\(Int(currentTemp))°C")
}
.tint(.orange)Индикатор может быть выполнен в нескольких стилях (
.linearCapacity, .accessoryCircular и других) и естественным образом адаптируется к различным макетам — от круглых индикаторов в стиле приборной панели до компактных виджетов.Используйте
Gauge , когда:🔹 ProgressView — индикатор выполнения задачи
ProgressView предназначен для отслеживания прогресса, а не для отображения числовых значений. Он показывает, какая часть задачи выполнена, либо детерминированно (известная доля), либо неопределённо (индикатор вращения).ProgressView(value: progress, total: 1.0)
.tint(.green)
ProgressView(value: progress, total: 1.0)
.tint(.green)
Он хорошо подходит для экранов загрузки/выгрузки, процессов адаптации или длительных операций.
Ключевое отличие от
Gauge заключается в контексте: значение представляет не реальное измерение, а состояние процесса.Используйте
ProgressView , когда:🔹 Ползунок — обеспечивает прямое управление пользователем
В отличие от
Gauge и ProgressView, Slider позволяет вводить данные. Это правильный выбор, если вы хотите, чтобы пользователь мог установить или изменить числовое значение, например яркость, громкость или интенсивность фильтра.Slider(value: $volume, in: 0...100) {
Text("Volume")
}
.tint(.blue)
Slider(value: $volume, in: 0...100) {
Text("Volume")
}
.tint(.blue)Slider напрямую связывается со свойством состояния с помощью Binding, что делает его оптимальным вариантом для любой интерактивной числовой настройки.Используйте
Slider , когда:🔹 Выбор правильного представления
При выборе из трёх вариантов:
Gauge.ProgressView.Slider.Каждый из этих видов соответствует принципам дизайна Apple, нап равленным на ясность и доступность. Понимание их сути поможет вам создавать интерфейсы, которые будут выглядеть правильно и вести себя естественно в экосистеме SwiftUI.
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM