SwiftUI@State变量未及时赋值

SwiftUI@State变量未及时赋值,swift,swiftui,Swift,Swiftui,我想展示两张床单。他们中的一个进行了辩论。 当我试图显示第二张工作表时,该代码崩溃,因为未指定强制展开的参数。即使我在更新触发工作表显示的变量之前分配了它,也会发生这种情况。 someArgument怎么可能仍然为零 这是再现错误所需的全部代码: enum ActiveSheet: Identifiable { case first, second var id: Int { hashValue } } struct ContentView: View

我想展示两张床单。他们中的一个进行了辩论。 当我试图显示第二张工作表时,该代码崩溃,因为未指定强制展开的参数。即使我在更新触发工作表显示的变量之前分配了它,也会发生这种情况。
someArgument
怎么可能仍然为零

这是再现错误所需的全部代码:

enum ActiveSheet: Identifiable {
    case first, second

    var id: Int {
        hashValue
    }
}

struct ContentView: View {
    @State var activeSheet: ActiveSheet?
    @State var someArgument: String?

    var body: some View {
        VStack {
            Button {
                activeSheet = .first
            } label: {
                Text("Activate first sheet")
            }

            Button {
                someArgument = "Show this text"
                activeSheet = .second
            } label: {
                Text("Activate second sheet")
            }
        }
        .sheet(item: $activeSheet) { item in
            switch item {
            case .first:
                FirstView()
            case .second:
                SecondView(message: someArgument!)
            }
        }
    }
}

struct FirstView: View {
    var body: some View {
        Text("Hello I'm 1")
    }
}

struct SecondView: View {
    let message: String
    var body: some View {
        Text(message)
    }
}

我想这不是很直接的原因是导航链接通常用于这种用例。

一种可能的修复方法是将参数字符串作为
ActiveSheet
enum的关联值传递。这样,它将在初始化枚举的同时可用:

enum ActiveSheet: Identifiable, Hashable {
    case first
    case second(String)

    var id: Int { hashValue }
}

struct ContentView: View {
    @State var activeSheet: ActiveSheet?

    var body: some View {
        VStack {
            Button {
                activeSheet = .first
            } label: {
                Text("Activate first sheet")
            }

            Button {
                activeSheet = .second("Show this text")
            } label: {
                Text("Activate second sheet")
            }
        }
        .sheet(item: $activeSheet) { item in
            switch item {
            case .first:
                FirstView()
            case .second(let someArgument):
                SecondView(message: someArgument)
            }
        }
    }
}

struct FirstView: View {
    var body: some View {
        Text("Hello I'm 1")
    }
}

struct SecondView: View {
    let message: String
    var body: some View {
        Text(message)
    }
}

一种可能的修复方法是将参数字符串作为
ActiveSheet
enum的关联值传递。这样,它将在初始化枚举的同时可用:

enum ActiveSheet: Identifiable, Hashable {
    case first
    case second(String)

    var id: Int { hashValue }
}

struct ContentView: View {
    @State var activeSheet: ActiveSheet?

    var body: some View {
        VStack {
            Button {
                activeSheet = .first
            } label: {
                Text("Activate first sheet")
            }

            Button {
                activeSheet = .second("Show this text")
            } label: {
                Text("Activate second sheet")
            }
        }
        .sheet(item: $activeSheet) { item in
            switch item {
            case .first:
                FirstView()
            case .second(let someArgument):
                SecondView(message: someArgument)
            }
        }
    }
}

struct FirstView: View {
    var body: some View {
        Text("Hello I'm 1")
    }
}

struct SecondView: View {
    let message: String
    var body: some View {
        Text(message)
    }
}