理解@State SwiftUI

Undestranding @State SwiftUI

大家好,我在理解 swiftUI 中的@State 时遇到了问题

我会更好地解释......正如您从 scrollView 内的图像中看到的那样,我有两个视图,一个包含日历,另一个包含用户日期选择的摘要。

现在...我曾经使用用户在日历上选择的日期更新 summaryView

 @State private var selectedDate: Date = Self.now
 private static var now = Date ()

此外,在包含用户选择摘要的视图中(日历上方的视图),还有一个使用函数创建的随机黄色字符串

// MARK: - Generate Random String
private extension Reservations {
    
     func generateRandomString(length: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
            var s = ""
            for _ in 0 ..< length {
                s.append(letters.randomElement()!)
            }
            return s
     }
}

每次用户在日历上选择一天时它都会改变。

我的问题是,当用户选择一个日历日时,应用只需更改摘要视图中的日期,而不必再次重复“randomString”函数

这个问题是因为使用了@State 我理解的对吗?我应该使用什么代替 @State 来更改不在同一视图中的单个值?


struct Reservations: View {
    
    @Environment(\.calendar) private var calendar
    
    @State private var selectedDate: Date = Self.now
    private static var now = Date()
    
    var body: some View {
        
        Summary()
        ReservationsCalendar()
    }
}

// MARK: - Generate Random String
private extension Reservations {
    
     func generateRandomString(length: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
            var s = ""
            for _ in 0 ..< length {
                s.append(letters.randomElement()!)
            }
            return s
     }
    
    @ViewBuilder func Summary() -> some View {
        
        HStack(spacing: 10) {
            
            HStack {
       Text(selectedDate.dayFormatted(style: .twoDigits))
                .font(.title.bold())

                Text("ID").foregroundColor(.white)
                Text(generateRandomString(length: 7).uppercased())
                    .foregroundColor(.yellow)
                    .padding(.horizontal, 10)
                    .frame(height: 25)
                    .background(
                       Capsule()
                        .fill(.black.opacity(0.2))
                    )
            }
        }
    }


    @ViewBuilder private func ReservationsCalendar() -> some View {
        
      ReservationsCal(currentDate: $selectedDate)
        
    }
}

现在,您在视图层次结构中调用 generateRandomString,保证每次重新呈现视图时都会生成一个新的随机字符串。

相反,您可以将其声明为 @State 变量,该变量将在重新渲染期间持续存在(并声明 generateRandomString 以便它可以在初始化阶段使用):

struct Reservations: View {
    
    @State private var selectedDate: Date = Self.now
    @State private var randomString = Self.generateRandomString(length: 7)

    private static var now = Date()
    
    var body: some View {
        Text(randomString.uppercased())
    }
}

private extension Reservations {
    
    static func generateRandomString(length: Int) -> String {
       let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
           var s = ""
           for _ in 0 ..< length {
               s.append(letters.randomElement()!)
           }
           return s
    }
}