Всем привет!
Swift 6.2 принес нам небольшие, но очень приятные улучшения в работе со строками, которое многие давно ждали.
Какая была проблема:
До
Swift 6.2 при интерполяции опциональных значений мы постоянно сталкивались с надоедливым ворнингом:
let age: Int? = nil
print("Your age: \(age)")
// String interpolation produces a debug description for an optional value
Компилятор предлагал два неидеальных решения:
- String(describing:) - выводил nil, что некрасиво для пользователя.
- Оператор ?? - требовал значение того же типа, что не всегда удобно.
let age: Int? = nil
// Некрасиво
Text("Your age: \(String(describing: age))") // Your age: nil
// Не всегда уместно
Text("Your age: \(age ?? 0)") // Your age: 0, но 0 может быть некорректным!
Что изменилось в Swift 6.2:
Теперь можно использовать параметр
default прямо в интерполяции:
let age: Int? = nil
print("Your age: \(age, default: "not specified")") // Your age: not specified
Особенно удобно в SwiftUI:
struct ProfileView: View {
let username: String?
let level: Int?
var body: some View {
VStack {
Text("Username: \(username, default: "Guest")")
Text("Level: \(level, default: "Unknown")")
}
}
}
Что еще важно знать:
- Тип значения не важен: default всегда принимает строку.
- Работает с любыми опционалами: Int?, String?, Bool? и т.д.
- Проверки на этапе компиляции: нет влияния на производительность.
Есть ограничение: к сожалению не работает с
LocalizedStringKey.
Мое мнение:
Это одно из тех небольших улучшений, которые делают повседневную разработку удобнее. Больше не нужно выбирать между ворнингами компилятора и некрасивым выводом
nil в интерфейсе.