Search code examples
iosswiftswiftuiios16

Can't convert String to Int in @AppStorage


I want to convert all @AppStorage's to Int(or even to Float) value and after that multiply it. Or probably i should to convert salaryPh and hoursPm to Int values, but i also can't do it. I've tried to create function where i could change String to Int but it didn't help me

I think that i'm doing something wrong, tried to find the solution with same question and found only one, but it didn't help me(link)

import SwiftUI

struct HomeView: View {
    var body: some View {
        NavigationView {
            ExtractedView()
        }
    }
}

struct ExtractedView: View {
    @State var monthString = Date().getMonthString().lowercased().capitalized
    @State private var salaryPh: String = "" 
    @State private var hoursPm: String = ""
    @AppStorage("SALARY_KEY") var savedSalary = ""
    @AppStorage("HOURS_KEY") var savedHoursPm = ""
    
    var body: some View {
        ZStack {
            BackgroundView()
            CalendarView()
            
            RoundedRectangle(cornerRadius: 40)
                .frame(width: 225, height: 100)
                .foregroundColor(.blue)
                .offset(y: 190)
            
            VStack(alignment: .center, spacing: 13) {
                Text("Your netto-salary per hour")
                    .foregroundColor(Color.white)
                    .font(Font.system(size: 23, design: .rounded))
                    .fontWeight(.light)
                TextField("Salary", text: $salaryPh)
                    .frame(width: 100, height: 50)
                    .background(.black)
                    .opacity(0.5)
                    .foregroundColor(Color.white)
                    .multilineTextAlignment(.center)
                    .font(.system(.body, design: .monospaced))
                    .overlay (
                        RoundedRectangle(cornerRadius: 15)
                            .stroke(Color.blue, lineWidth: 4)
                    )
                    .onChange(of: salaryPh) { salaryPh in
                        self.savedSalary = salaryPh
                    }
                    .onAppear {
                        self.salaryPh = savedSalary
                        print("Loaded: \(savedSalary)")
                    }
            }
            .offset(y: -150)
            
            
            VStack(alignment: .center, spacing: 13) {
                Text("Hours in this month")
                    .foregroundColor(Color.white)
                    .font(Font.system(size: 23, design: .rounded))
                    .fontWeight(.light)
                TextField("Hours", text: $hoursPm)
                    .foregroundColor(Color.white)
                    .frame(width: 100, height: 50)
                    .background(.black)
                    .opacity(0.5)
                    .multilineTextAlignment(.center)
                    .font(.system(.body, design: .monospaced))
                    .overlay (
                        RoundedRectangle(cornerRadius: 15)
                            .stroke(Color.blue, lineWidth: 4)
                    )
                    .onChange(of: hoursPm) { hoursPm in
                        self.savedHoursPm = hoursPm
                    }
                    .onAppear {
                        self.hoursPm = savedHoursPm
                        print("Loaded: \(savedHoursPm)")
                    }
            }
            .offset(y: -20)
        
            VStack(spacing: 20) {
                Text("In \(monthString) i make:")
                    .foregroundColor(Color.white)
                    .font(Font.system(size: 23, design: .rounded))
                    .fontWeight(.light)
                                
            }
            .offset(y: 165)
        }
    }
}

struct HomeView_Previews: PreviewProvider {
    static var previews: some View {
        HomeView()
    }
}

Solution

  • You can get rid of all the conversion by using TextField with value.

        TextField(
            "Double",
            value: $myDouble,
            format: .number
        )
    

    This setup will work with Int too.

    Once the TextField is compatible with numbers you can switch all the Strings to be the correct number type.

    https://developer.apple.com/documentation/swiftui/textfield/init(_:value:format:prompt:)-3fh51