SwiftUI -无法将类型“some View”的值分配给类型“Image”

q8l4jmvw  于 2023-06-04  发布在  Swift
关注(0)|答案(1)|浏览(252)

我声明了一个类型为Image?并且当视图出现时,基于该条件,该变量可以被分配具有不同修改器的不同图像。但是,当我在Image之后添加修改器并将其分配给变量时,我得到了"Cannot assign value of type 'some View' to type 'Image'"错误。

struct TestView: View {
    @State private var testIcon: Image?

    var body: some View {
        NavigationView {
            VStack {
                self.testIcon
                Text("Hello World")
                Spacer()
            }.onAppear {
                if condition1 {
                    self.testIcon = Image(systemName: "hand.wave")
                } else if condition2 {
                    // Seeing error on this line
                    self.testIcon = Image(systemName: "calendar.circle").foregroundColor(.blue)
                } else {
                    // Seeing error on this line
                    self.testIcon = Image(systemName: "magnifyingglass").foregroundColor(.gray)
                }
            }
        }
    }
}

在我看到错误的行上,我试着添加“作为?图像”接近尾声。我没有得到错误,但testIcon是空的,当我尝试这样做:
self.testIcon = Image(systemName: "calendar.circle").foregroundColor(.blue) as? Imageself.testIcon = Image(systemName: "magnifyingglass").foregroundColor(.gray) as? Image
如何使用不同的修改器设置Image变量?

nsc4cvqm

nsc4cvqm1#

foregroundColor修饰符可以应用于其他视图类型,而不仅仅是Image。您可以在文本或形状或几乎任何View上使用它。
如果查看foregroundColor的声明,您将看到它返回some View。这样做的效果是,一旦应用了修饰符,开始时使用的View的初始类型(Image)对编译器不再可见。
您可以将testIcon的类型更改为(any View)?,这将允许赋值。
然而,整个方法在我看来是错误的。在onAppear中更改状态属性,可能会使视图层次结构无效,并导致立即刷新视图,这有点难看。
一般来说,你应该尽量避免在SwiftUI视图中使用过程性代码,而应该使用声明性代码。
你可以重构为:

var body: some View {
     NavigationView {
            VStack {
                IconView()
                Text("Hello World")
                Spacer()
            }
     }
}

struct IconView: View {
    var body: some View {
        if condition1 {
            Image(systemName: "hand.wave")
        } else if condition2 {
            Image(systemName: "calendar.circle").foregroundColor(.blue)
        } else {
            self.testIcon = Image(systemName: "magnifyingglass").foregroundColor(.gray)
        }
    }
}

相关问题