如果让 SwiftUI 进入 View [英] SwiftUI if let inside View
本文介绍了如果让 SwiftUI 进入 View的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想要一个 View
中的 if let 语句.
I want a if let statement inside a View
.
@ObservedObject var person: Person?
var body: some View {
if person != nil {
// this works
}
if let p = person {
// Compiler error
}
}
包含控制流语句的闭包不能与函数构建器ViewBuilder"一起使用
推荐答案
或者您可以创建自己的 IfLet
视图构建器:
Or you can create your own IfLet
view builder:
import SwiftUI
struct IfLet<Value, Content, NilContent>: View where Content: View, NilContent: View {
let value: Value?
let contentBuilder: (Value) -> Content
let nilContentBuilder: () -> NilContent
init(_ optionalValue: Value?, @ViewBuilder whenPresent contentBuilder: @escaping (Value) -> Content, @ViewBuilder whenNil nilContentBuilder: @escaping () -> NilContent) {
self.value = optionalValue
self.contentBuilder = contentBuilder
self.nilContentBuilder = nilContentBuilder
}
var body: some View {
Group {
if value != nil {
contentBuilder(value!)
} else {
nilContentBuilder()
}
}
}
}
extension IfLet where NilContent == EmptyView {
init(_ optionalValue: Value?, @ViewBuilder whenPresent contentBuilder: @escaping (Value) -> Content) {
self.init(optionalValue, whenPresent: contentBuilder, whenNil: { EmptyView() })
}
}
使用此功能,您现在可以执行以下操作:
Using this, you can now do the following:
var body: some View {
IfLet(pieceOfData) { realData in
// realData is no longer optional
}
}
如果您的可选项是nil
,想要回复吗?
Want to respond if your optional is nil
?
var body: some View {
IfLet(pieceOfData, whenPresent: { realData in
// realData is no longer optional
DataView(realData)
}, whenNil: {
EmptyDataView()
})
}
这篇关于如果让 SwiftUI 进入 View的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文