MOBILEPROGLIB Telegram 6072
⚠️ 5 незаметных ловушек Swift

Вот 10 ловушек Swift, которые кажутся безобидными — пока не настигнут вас.

1️⃣ Бездумное использование DispatchQueue.main.async

Да, вам нужно обновлять пользовательский интерфейс в основном потоке. Но если вы слепо обернете все в DispatchQueue.main.async, вы рискуете столкнуться с условиями гонки или задержками обновлений.

DispatchQueue.main.async {
self.label.text = "Updated"
}


Используйте это только в том случае, если вы уверены, что уже не находитесь в главном потоке.

2️⃣ Путаница между типами значений и ссылок

Структуры (такие как User) копируются при присваивании. Классы совместно используются по ссылке.

struct User {
var name: String
}

var a = User(name: "Abhinav")
var b = a
b.name = "Singh"

print(a.name) // Still "Abhinav"


Знайте, когда вам нужна неизменяемость (структура) и когда — общее состояние (класс). Их смешивание приводит к неприятным ошибкам.

3️⃣ Неправильное использование Codable

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
}


4️⃣ Неправильное использование @Published в SwiftUI/Combine

Простое добавление @Published не вызывает обновление пользовательского интерфейса вне основного потока или если обновление происходит косвенно.

@Published var name: String = ""

DispatchQueue.global().async {
self.name = "New" // No UI update
}
Всегда обновляйте свойства @Published в главном потоке:

DispatchQueue.main.async {
self.name = "New"
}


5️⃣ Путаница между Any и AnyObject

Они кажутся похожими, но на самом деле это не так. Any означает любой тип. AnyObject означает любой тип класса.

func handle(data: Any) { ... }         // Can be Int, String, Class, etc.
func handleObject(data: AnyObject) { ... } // Only class instances


Будьте точны в том, что вы используете. Использование Any может привести к путанице при преобразовании типов во время выполнения.

Какие ловушки чаще вам встречаются? Пишите в комментариях 💬

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1



tgoop.com/mobileproglib/6072
Create:
Last Update:

⚠️ 5 незаметных ловушек Swift

Вот 10 ловушек Swift, которые кажутся безобидными — пока не настигнут вас.

1️⃣ Бездумное использование DispatchQueue.main.async

Да, вам нужно обновлять пользовательский интерфейс в основном потоке. Но если вы слепо обернете все в DispatchQueue.main.async, вы рискуете столкнуться с условиями гонки или задержками обновлений.

DispatchQueue.main.async {
self.label.text = "Updated"
}


Используйте это только в том случае, если вы уверены, что уже не находитесь в главном потоке.

2️⃣ Путаница между типами значений и ссылок

Структуры (такие как User) копируются при присваивании. Классы совместно используются по ссылке.

struct User {
var name: String
}

var a = User(name: "Abhinav")
var b = a
b.name = "Singh"

print(a.name) // Still "Abhinav"


Знайте, когда вам нужна неизменяемость (структура) и когда — общее состояние (класс). Их смешивание приводит к неприятным ошибкам.

3️⃣ Неправильное использование Codable

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
}


4️⃣ Неправильное использование @Published в SwiftUI/Combine

Простое добавление @Published не вызывает обновление пользовательского интерфейса вне основного потока или если обновление происходит косвенно.

@Published var name: String = ""

DispatchQueue.global().async {
self.name = "New" // No UI update
}
Всегда обновляйте свойства @Published в главном потоке:

DispatchQueue.main.async {
self.name = "New"
}


5️⃣ Путаница между Any и AnyObject

Они кажутся похожими, но на самом деле это не так. Any означает любой тип. AnyObject означает любой тип класса.

func handle(data: Any) { ... }         // Can be Int, String, Class, etc.
func handleObject(data: AnyObject) { ... } // Only class instances


Будьте точны в том, что вы используете. Использование Any может привести к путанице при преобразовании типов во время выполнения.

Какие ловушки чаще вам встречаются? Пишите в комментариях 💬

🐸 Библиотека мобильного разработчика

#буст

BY Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck


Share with your friend now:
tgoop.com/mobileproglib/6072

View MORE
Open in Telegram


Telegram News

Date: |

How to Create a Private or Public Channel on Telegram? Unlimited number of subscribers per channel Members can post their voice notes of themselves screaming. Interestingly, the group doesn’t allow to post anything else which might lead to an instant ban. As of now, there are more than 330 members in the group. The main design elements of your Telegram channel include a name, bio (brief description), and avatar. Your bio should be: So far, more than a dozen different members have contributed to the group, posting voice notes of themselves screaming, yelling, groaning, and wailing in various pitches and rhythms.
from us


Telegram Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
FROM American