मैं वर्तमान में स्विफ्ट 4 को स्विफ्ट 5 में अपग्रेड कर रहा हूं और एक्सकोड ने निम्नलिखित परिवर्तनों की सिफारिश की है। हालाँकि, मैं सोच रहा हूँ कि क्या यह स्विफ्ट 4 में लागू किए गए किसी भी तर्क को प्रभावित करता है।

extension JSONDecoder {
  
  static let convertFromSnakeCaseDecoder: JSONDecoder = {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    return decoder
  }()
}

struct CustomError: Codable {
  let errors: [String]
}

private func decodeCustomError(data: Data, statusCode: Int) -> CustomError?  {
  if let errorData = try? JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) as CustomError? {
    if let errorData = errorData {
       return formCustomError(jsonError)
    }
    return formCustomError(parsingError)
  } else if let errorMessage = State(rawValue: statusCode) {
    return formCustomError(errorMessage)
  } else {
    return formCustomError(genericError)
  }
}

स्विफ्ट 4 (वर्तमान कार्यान्वयन)

if let customError = try? JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) as CustomError?

स्विफ्ट 5 (अनुशंसित परिवर्तन)

if let customError = ((try? JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) as CustomError?) as CustomError??)

क्या मैं सुरक्षित रूप से मान सकता हूं कि ये वही हैं?

0
konya 12 फरवरी 2021, 20:52
1
मूल कोड मुझे अजीब लग रहा है, कलाकारों की आवश्यकता क्यों है?
 – 
Joakim Danielson
12 फरवरी 2021, 20:59
मैंने कोड में लापता टुकड़ा जोड़ा है। मुझे आपका बहुमूल्य सुझाव सुनना अच्छा लगेगा?
 – 
konya
12 फरवरी 2021, 21:04

1 उत्तर

सबसे बढ़िया उत्तर

एक प्रकार की कास्ट की बिल्कुल भी आवश्यकता नहीं है, स्विफ्ट 5 में संभावित डबल विकल्प चपटे हैं

if let customError = try? JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) {

}

हालांकि, संभावित त्रुटि को हमेशा (कम से कम print) संभालने की अत्यधिक अनुशंसा की जाती है

do {
    let customError = try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data)
    // do something with the error
} catch { print(error) }

संपादित करें:

विधि decodeCustomError do - catch ब्लॉक के साथ है

private func decodeCustomError(data: Data, statusCode: Int) -> CustomError  {
   do {
       return try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data)      
   } catch {
       if let errorMessage = State(rawValue: statusCode) {
          return formCustomError(errorMessage)
       } else {
          return formCustomError(error) // assuming `formCustomError` accepts an `Error` argument
       }
   }
}
1
vadian 12 फरवरी 2021, 22:17
विस्तृत उत्तर और सुझाव देने के लिए आपका बहुत-बहुत धन्यवाद। मैंने आपको एक बेहतर तस्वीर देने के लिए लापता टुकड़ा जोड़ा है जहां मैं संघर्ष कर रहा हूं। मैंने लापता विधि decodeCustomError जोड़ दी है, मुझे आश्चर्य है कि मैं do catch कथन में कैसे फिट हो सकता हूं जैसा आपने सुझाव दिया था क्योंकि मेरे पास कई अन्य परिदृश्य हैं।
 – 
konya
12 फरवरी 2021, 21:51
{ को मिटाने की जरूरत है, है ना? let customError = try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) {
 – 
konya
12 फरवरी 2021, 22:12
यह है, पृष्ठ को पुनः लोड करें, और आप सीधे डिकोड की गई वस्तु को return कर सकते हैं।
 – 
vadian
12 फरवरी 2021, 22:13
साथ ही, मुझे निम्नलिखित return formCustomError(parsingError) दिखाई नहीं दे रहे हैं, क्या कहीं parsingError को संभालने का कोई तरीका है?
 – 
konya
12 फरवरी 2021, 22:13
1
यह स्पष्ट नहीं है कि formCustomError वास्तव में क्या है, लेकिन इसके बजाय formCustomError(genericError) पार्सिंग त्रुटि (अंतर्निहित error उदाहरण catch ब्लॉक में) लौटाएं या सामान को एक अलग क्रम में लौटाएं।
 – 
vadian
12 फरवरी 2021, 22:16