Swift ui macos @ опубликовано ноль или целое число

#swift #null #swiftui #integer

#swift #null #swiftui #целое число

Вопрос:

У меня есть следующая переменная, я бы хотел, чтобы она принимала nil в качестве начального значения, а затем значение Int.

 @Published var status: Int = 0
  

Для лучшего понимания разместите весь ссылочный код:

 struct ServerMessage: Decodable {
    let token: String
}

class Http: ObservableObject {
    @Published var status: Int = 0
    @Published var authenticated = false
    func req(url: String, httpMethod: String, body: [String: String]?) {
        guard let url = URL(string: url) else { return }
        let httpBody = try! JSONSerialization.data(withJSONObject: body ?? [])
        var request = URLRequest(url: url)
        request.httpMethod = httpMethod
        request.httpBody = httpBody
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        URLSession.shared.dataTask(with: request) { data, response, error in
            if error != nil {
                print("Error: (String(describing: error))")
                return
            }
            
            if let httpResponse = response as? HTTPURLResponse {
                switch httpResponse.statusCode {
                case 400: do {
                    print("Error: 400")
                    DispatchQueue.main.async {
                        self.status = 400
                    }
                    return
                    }
                case 401: do {
                    print("Error: 401")
                    DispatchQueue.main.async {
                        self.status = 401
                    }
                    return
                    }
                default: do {}
                }
            }
            
            do {
                if let data = data {
                    let results = try JSONDecoder().decode(ServerMessage.self, from: data)
                    DispatchQueue.main.async {
                        self.authenticated = true
                    }
                    print("Ok.", results)
                } else {
                    print("No data.")
                }
            } catch {
                print("Error:", error)
            }
        }.resume()
    }
}
  

Использовать:

 self.http.req(
            url: "",
            httpMethod: "POST",
            body: ["email": "", "password": ""]
        )
  

Ответ №1:

Сделайте это необязательным (со всеми следующими исправлениями вместо использования)

 @Published var status: Int? = nil     // << I like explicit initialising 
  

Обновление: возможный вариант использования в представлении

 Text("(http.status ?? 0)")    // << it is Int, so ?? "" is not valid
  

но, вероятно, это более уместно (из-за отсутствия смысла показывать поле неизвестного статуса)

 if http.status != nil {
   Text("(http.status!)")
}
  

Комментарии:

1. Я пробовал что-то подобное, проблема в том, что когда я использую это так: Текст (» (http.status)») Ошибка: метод экземпляра ‘appendInterpolation’ требует, чтобы ‘Int?’ соответствовал ‘_FormatSpecifiable’

2. Это даже так не работает: Текст (» (http.status ??» «)») или текст (» (http.$status ??» «)»)

3. Последний пример, похоже, работает так, как указывает точка! по http.status?