tgoop.com/mobileproglib/6201
Create:
Last Update:
Last Update:
Вот пять небольших трюков, которые незаметно избавят вас от ненужных элементов, придав коду вашего приложения элегантный вид.
Вместо бесконечных операторов if let
создайте простое расширение, которое сделает обработку опциональных параметров естественной:
extension View {
@ViewBuilder
func ifLet<T, Content: View>(_ value: T?, content: (T) -> Content) -> some View {
if let value {
content(value)
} else {
self
}
}
}
Теперь вы можете просто писать:
Text("Hello")
.ifLet(username) { Text("Welcome, \($0)") }
Мы все пишем
.padding()
или .opacity()
с условиями. Вместо того, чтобы заключать целые представления в блоки if, используйте это:extension View {
@ViewBuilder
func apply(_ condition: Bool, modifier: (Self) -> some View) -> some View {
if condition {
modifier(self)
} else {
self
}
}
}
Использование:
Text("Premium")
.apply(isPro) { $0.foregroundColor(.yellow) }
Одна строка, ничего лишнего.
Загрузка изображений — обычное дело, но повторение одной и той же логики плейсхолдера утомляет. Сделайте один раз:
struct RemoteImage: View {
let url: URL
var body: some View {
AsyncImage(url: url) { phase in
switch phase {
case .success(let image): image.resizable().scaledToFit()
case .failure(_): Color.gray
case .empty: ProgressView()
@unknown default: EmptyView()
}
}
}
}
Теперь вам больше не придётся переписывать загрузчики изображений.
Вместо того, чтобы создавать DateFormatter везде, добавьте расширение:
extension Date {
func formatted(_ style: DateFormatter.Style = .medium) -> String {
let formatter = DateFormatter()
formatter.dateStyle = style
return formatter.string(from: self)
}
}
Использование:
Text(Date().formatted(.long))
Легко читаемый и многоразовый код.
Не любите бороться с
.ignoresSafeArea()
? Добавьте небольшой вспомогательный метод:extension View {
func fillScreen() -> some View {
self.frame(maxWidth: .infinity, maxHeight: .infinity)
.ignoresSafeArea()
}
}
Теперь для каждого полноэкранного представления требуется всего один модификатор.
#буст