tgoop.com/mobileproglib/6072
Create:
Last Update:
Last Update:
Вот 10 ловушек Swift, которые кажутся безобидными — пока не настигнут вас.
Да, вам нужно обновлять пользовательский интерфейс в основном потоке. Но если вы слепо обернете все в DispatchQueue.main.async
, вы рискуете столкнуться с условиями гонки или задержками обновлений.
DispatchQueue.main.async {
self.label.text = "Updated"
}
Используйте это только в том случае, если вы уверены, что уже не находитесь в главном потоке.
Структуры (такие как
User
) копируются при присваивании. Классы совместно используются по ссылке.struct User {
var name: String
}
var a = User(name: "Abhinav")
var b = a
b.name = "Singh"
print(a.name) // Still "Abhinav"
Знайте, когда вам нужна неизменяемость (структура) и когда — общее состояние (класс). Их смешивание приводит к неприятным ошибкам.
Codable
в Swift — это замечательно… до тех пор, пока не изменится структура JSON и декодирование без предупреждения не завершится с ошибкой.struct User: Codable {
let id: Int
let name: String
}
Если бэкэнд отправит
user_id
вместо id
, декодирование завершится сбоем.Используйте
CodingKeys
явно, когда поля различаются:enum CodingKeys: String, CodingKey {
case id = "user_id"
case name
}
Простое добавление @Published не вызывает обновление пользовательского интерфейса вне основного потока или если обновление происходит косвенно.
@Published var name: String = ""
DispatchQueue.global().async {
self.name = "New" // No UI update
}
Всегда обновляйте свойства
@Published
в главном потоке:DispatchQueue.main.async {
self.name = "New"
}
Они кажутся похожими, но на самом деле это не так.
Any
означает любой тип. AnyObject
означает любой тип класса.func handle(data: Any) { ... } // Can be Int, String, Class, etc.
func handleObject(data: AnyObject) { ... } // Only class instances
Будьте точны в том, что вы используете. Использование
Any
может привести к путанице при преобразовании типов во время выполнения.Какие ловушки чаще вам встречаются? Пишите в комментариях
#буст