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: |

For crypto enthusiasts, there was the “gm” app, a self-described “meme app” which only allowed users to greet each other with “gm,” or “good morning,” a common acronym thrown around on Crypto Twitter and Discord. But the gm app was shut down back in September after a hacker reportedly gained access to user data. Matt Hussey, editorial director of NEAR Protocol (and former editor-in-chief of Decrypt) responded to the news of the Telegram group with “#meIRL.” Image: Telegram. Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day. According to media reports, the privacy watchdog was considering “blacklisting” some online platforms that have repeatedly posted doxxing information, with sources saying most messages were shared on Telegram.
from us


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