swift - स्विफ्ट में त्रुटि प्रकार के साथ स्थानीयकृत विवरण कैसे प्रदान करें?




swift3 error-handling (4)

मैं स्विफ्ट 3 सिंटैक्स के साथ एक कस्टम त्रुटि प्रकार को परिभाषित कर रहा हूं और मैं उस त्रुटि के उपयोगकर्ता-अनुकूल विवरण प्रदान करना चाहता हूं जो Error ऑब्जेक्ट के localizedDescription गुण द्वारा वापस किया गया है। मैं यह कैसे कर सकता हूं?

public enum MyError: Error {
  case customError

  var localizedDescription: String {
    switch self {
    case .customError:
      return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
    }
  }
}

let error: Error = MyError.customError
error.localizedDescription
// "The operation couldn’t be completed. (MyError error 0.)"

क्या मेरे कस्टम त्रुटि विवरण ("त्रुटि के उपयोगकर्ता-अनुकूल वर्णन") को वापस करने के लिए localizedDescription विवरण के लिए कोई रास्ता है? ध्यान दें कि यहाँ त्रुटि ऑब्जेक्ट Error और MyError नहीं। मैं, निश्चित रूप से, MyError को ऑब्जेक्ट कास्ट कर सकता हूं

(error as? MyError)?.localizedDescription

लेकिन क्या यह मेरी त्रुटि प्रकार के लिए कास्टिंग के बिना काम करने का एक तरीका है?


एक संरचना का उपयोग करना एक विकल्प हो सकता है। स्थैतिक स्थानीयकरण के साथ थोड़ा सा लालित्य:

import Foundation

struct MyError: LocalizedError, Equatable {

   private var description: String!

   init(description: String) {
       self.description = description
   }

   var errorDescription: String? {
       return description
   }

   public static func ==(lhs: MyError, rhs: MyError) -> Bool {
       return lhs.description == rhs.description
   }
}

extension MyError {

   static let noConnection = MyError(description: NSLocalizedString("No internet connection",comment: ""))
   static let requestFailed = MyError(description: NSLocalizedString("Request failed",comment: ""))
}

func throwNoConnectionError() throws {
   throw MyError.noConnection
}

do {
   try throwNoConnectionError()
}
catch let myError as MyError {
   switch myError {
   case .noConnection:
       print("noConnection: \(myError.localizedDescription)")
   case .requestFailed:
       print("requestFailed: \(myError.localizedDescription)")
   default:
      print("default: \(myError.localizedDescription)")
   }
}

ऑब्जेक्टिव-सी के लिए अतिरिक्त जानकारी प्रदान करने के लिए अब दो एरर-एडॉप्टिंग प्रोटोकॉल हैं जिन्हें आपका एरर टाइप अपना सकता है - लोकलाइज्डइरॉयर और CustomNSError। यहाँ एक उदाहरण त्रुटि है जो दोनों को अपनाती है:

enum MyBetterError : CustomNSError, LocalizedError {
    case oops

    // domain
    static var errorDomain : String { return "MyDomain" }
    // code
    var errorCode : Int { return -666 }
    // userInfo
    var errorUserInfo: [String : Any] { return ["Hey":"Ho"] };

    // localizedDescription
    var errorDescription: String? { return "This sucks" }
    // localizedFailureReason
    var failureReason: String? { return "Because it sucks" }
    // localizedRecoverySuggestion
    var recoverySuggestion: String? { return "Give up" }

}

मैं भी जोड़ूंगा, अगर आपकी त्रुटि में इस तरह के पैरामीटर हैं

enum NetworkError: LocalizedError {
  case responseStatusError(status: Int, message: String)
}

आप इन मापदंडों को अपने स्थानीयकृत विवरण में इस तरह से कॉल कर सकते हैं:

extension NetworkError {
  var errorDescription: String {
    switch self {
    case .responseStatusError(status: let status, message: let message):
      return "Error with status \(status) and message \(message) was thrown"
  }
}

आप इसे इस तरह छोटा भी कर सकते हैं:

extension NetworkError {
  var errorDescription: String {
    switch self {
    case let .responseStatusError(status, message):
      return "Error with status \(status) and message \(message) was thrown"
  }
}

यहाँ और अधिक सुंदर समाधान है:

  enum ApiError: String, LocalizedError {

    case invalidCredentials = "Invalid credentials"
    case noConnection = "No connection"

    var localizedDescription: String { return NSLocalizedString(self.rawValue, comment: "") }

  }




nslocalizedstring