Cannot convert value of type 'Int' to expected argument type 'string'

I have a URL session to send to a webhook. I have already set up the query which are strings, but one I tried to do along with a Stepper control value, and added it to the list of URLQueryItem, and I got a error that says Cannot convert value of type 'int' to expected argument type 'string'. So it turns out the value in the Stepper is actually a interger (or a Int type) and not a String.

here's the code


struct ContentView: View {
    
    @State private var TweetStatus = ""
    @State private var response = ""
    @State var showAlert = false
    @State var SendToWebhook = false
    @State var StepperValue = 0
    
    var body: some View {
        NavigationView {
            Form {
                Section(footer: Text("Test")) {
                    TextField("Field to place response data", text: $response)
                    TextEditor( text: $TweetStatus)
                        .frame(height: 100)
                    
                    // Stepper
                    Stepper(value: $StepperValue, in: 0...10080) {
                        Text("Duration in Minutes: \(StepperValue)")
                    }
                    
                }
                Section {
                    
                    Button("Get Data") {
                        requestTest() { results in
                            response = results
                            if response == "No Data!" {
                                showAlert = true
                            }
                        }
                    }
                    
                    
                }
            }
            .alert(isPresented: $showAlert) {
                Alert(title: Text("Tweet Sent"), message: Text("Your Tweet is sent! Your Tweet ID is shown in the field"), dismissButton: .default(Text("OK")))
            }
        }
    }
    func requestTest(completion: @escaping(String) -> ()) {   // <--- here completion closure
        if let url = URL(string: "http://YIKES") {
            
            var request = URLRequest(url: url)
            request.httpMethod = "POST"
            request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            
            var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
            components.queryItems = [ URLQueryItem(name: "TweetID", value: response), 
                                      URLQueryItem(name: "Status", value: TweetStatus), 
                                      URLQueryItem(name: "PollDuration", value: StepperValue)]
            
            if let query = components.url!.query {
                request.httpBody = Data(query.utf8)
            }
            
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                if let data = data,
                   let apiResponse = String(data: data, encoding: .utf8) {
                    
                    // IF Completed, these actions are shown below
                    
                    completion(apiResponse)    // <--- here
                    self.showAlert = true
                    TweetStatus = ""
                } else {
                    completion("No Data!")   // <--- here
                }
            }
            task.resume()
        }
    }
}

So what I am trying to do is to pass the id StepperValue as a string to get it into the URLQueryItem. I can't even use a String(SOMETHING), to no avail either. I think it's Swift 5.5 so there have to be some code changes to this.

Answered by robnotyou in 700664022

When you say...

Text("Duration in Minutes: \(StepperValue)")

...you are converting StepperValue from Int to String.

So change:

URLQueryItem(name: "PollDuration", value: StepperValue)

to:

URLQueryItem(name: "PollDuration", value: "\(StepperValue)")
Accepted Answer

When you say...

Text("Duration in Minutes: \(StepperValue)")

...you are converting StepperValue from Int to String.

So change:

URLQueryItem(name: "PollDuration", value: StepperValue)

to:

URLQueryItem(name: "PollDuration", value: "\(StepperValue)")

Query expect String and you pass StepperValue which is an Int.

What did you try to convert to String ?

Did you do this:

            let strValue = "\(StepperValue)"
            var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
            components.queryItems = [ URLQueryItem(name: "TweetID", value: response), 
                                      URLQueryItem(name: "Status", value: TweetStatus), 
                                      URLQueryItem(name: "PollDuration", value: strValue)]

Note: var names should start with lowerCase: stepperValue

Cannot convert value of type 'Int' to expected argument type 'string'
 
 
Q