trimmingCharacters()
로 빈 문자열이 아닌지 확인했다. 찾아보니, 만약 공백 문자열을 제출하면 trim 이후 빈 문자열을 반환한다고 해서 == ""
로 빈 문자열을 확인했다.
trimmingCharacters(in:)
var hasValidAddress: Bool {
if name.isEmpty || streetAddress.isEmpty || city.isEmpty || zip.isEmpty || streetAddress.trimmingCharacters(in: .whitespacesAndNewlines) == "" {
return false
}
return true
}
placeOrder()
가 실패할 경우 alert 나타내기해당 함수에 이미 실패할 경우에 return을 하도록 설정되어 있어서, retrun 값을 성공했을 땐 true, 실패했을 땐 false로 설정했다. 그리고 placeOrder()
를 실행한 후 return 값에 따라 alert 메시지를 변경했다.
Button("Place Order") {
Task {
if !(await placeOrder()) {
confirmationMessage = "Failed to place order. Please check if you're in proper environment."
showingConfirmation = true
}
}
}
func placeOrder() async -> Bool{
guard let encoded = try? JSONEncoder().encode(order) else {
print("Error: Failed to encode order")
return false
}
let url = URL(string: "https://reqres.in/api/cupcakes")!
var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
do {
let (data, _) = try await URLSession.shared.upload(for: request, from: encoded)
let decodedOrder = try JSONDecoder().decode(Order.self, from: data)
confirmationMessage = "Your order for \(decodedOrder.quantity) x \(Order.types[decodedOrder.type].lowercased()) cupcakes is on its way!"
showingConfirmation = true
return true
} catch {
print("Error: Get \(error.localizedDescription)")
return false
}
}
class가 만들어질 때(initializer) 이전의 값은 없었는지 확인하고 불러오고, 값이 바뀌면 바로 Userdefaults에 저장되도록 했다.
그래서 앱을 닫아도 주소 정보가 저장된다.
속성 정의:
var name = "" {
didSet {
UserDefaults.standard.setValue(name, forKey: "Name")
}
}
var streetAddress = "" {
didSet {
UserDefaults.standard.setValue(streetAddress, forKey: "StreetAddress")
}
}
var city = "" {
didSet {
UserDefaults.standard.setValue(city, forKey: "City")
}
}
var zip = "" {
didSet {
UserDefaults.standard.setValue(zip, forKey: "Zip")
}
}
initializer 정의:
init() {
self.name = UserDefaults.standard.string(forKey: "Name") ?? ""
self.streetAddress = UserDefaults.standard.string(forKey: "StreetAddress") ?? ""
self.city = UserDefaults.standard.string(forKey: "City") ?? ""
self.zip = UserDefaults.standard.string(forKey: "Zip") ?? ""
}