pchocoios
pchocoios

Reputation: 55

Initializer for conditional binding must have Optional type, not 'Error.Protocol'

I am creating a function where in validates a passcode, I tried to debug it and look for possible solution, but seems I can't look for a better solution for it.

Error Here

 func validateEventPasscode(){
        //Show Loading
        self.view.squareLoading.start(0.0)

        let api = APIService ()

        api.validatePasscode(eventcode: eventCode) { (data, error) in

            guard let eventDetails = self.event, error == nil else {

                if let networkError = Error.self {

                    if networkError == .InvalidCredentials {
                        _ = SCLAlertView(appearance: appearance).showError("Ooops!", subTitle: "Please enter a valid event passcode")
                    }else {
                        _ = SCLAlertView(appearance: appearance).showError("Network Error", subTitle: "\(networkError.rawValue)")
                    }
                }

                self.view.squareLoading.stop(0.0)
                return
            }
          guard eventDetails.deleteFlag == false else {

          _ = SCLAlertView(appearance: appearance).showError("Ooops!", subTitle: "Please enter a valid event passcode")

         self.view.squareLoading.stop(0.0)

        return
       }

      if (eventDetails.closedFlag == true && eventDetails.reopenFlag == false) {
       _ = SCLAlertView(appearance: appearance).showError("Closed Event", subTitle: "Please check the status of your event and try again")

       self.view.squareLoading.stop(0.0)
       return
      }

Where .InvalidCredentials came from

enum NetworkError: Error {

   case InvalidCredentials
   case custom(String)
   case other

 }

extension NetworkError: LocalizedError {
   var errorDescription: String? {
     switch self {
        case .InvalidCredentials:
            return "Invalid event code"
        case .other:
            return "Something went wrong"
        case .custom:(let message):
            return message
     }
   }
 }

I used this link as my reference, for APIService I used in validatePasscode validatePasscode reference

Upvotes: 0

Views: 406

Answers (2)

Oscar Apeland
Oscar Apeland

Reputation: 6662

It seems like you're trying to cast your error to an object of the Error type, which can be done like this

               if let networkError = error as? Error {

                if networkError == .InvalidCredentials {
                    _ = SCLAlertView(appearance: appearance).showError("Ooops!", subTitle: "Please enter a valid event passcode")
                }else {
                    _ = SCLAlertView(appearance: appearance).showError("Network Error", subTitle: "\(networkError.rawValue)")
                }
            }

Edit - Here's your code fixed

enum NetworkError: Error {
   case invalidCredentials
   case custom(String)
   case other
}

extension NetworkError: LocalizedError {
   var errorDescription: String? {
     switch self {
        case .invalidCredentials:
            return "Invalid event code"
        case .other:
            return "Something went wrong"
        case .custom(let message):
            return message
      }
   }
}

func validateEventPasscode() {
        //Show Loading
        self.view.squareLoading.start(0.0)

        let api = APIService()
        api.validatePasscode(eventcode: eventCode) { (data, error) in

            guard let eventDetails = self.event, error == nil else {
                guard let error = error as? NetworkError else { return }

                switch error {
                case .invalidCredentials:
                    _ = SCLAlertView(appearance: appearance).showError("Ooops!", subTitle: "Please enter a valid event passcode")

                case .custom(let message):
                    print(message)

                case .other:
                    _ = SCLAlertView(appearance: appearance).showError("Network Error", subTitle: "\(networkError.rawValue)")
                }


                self.view.squareLoading.stop(0.0)
                return
            }

            guard !eventDetails.deleteFlag else {
                _ = SCLAlertView(appearance: appearance).showError("Ooops!", subTitle: "Please enter a valid event passcode")
                self.view.squareLoading.stop(0.0)
                return
            }

            if eventDetails.closedFlag, !eventDetails.reopenFlag {
                _ = SCLAlertView(appearance: appearance).showError("Closed Event", subTitle: "Please check the status of your event and try again")

                self.view.squareLoading.stop(0.0)
                return
            }
        }
    }

Upvotes: 1

vadian
vadian

Reputation: 285220

You have to optional bind the optional error parameter, not the non-optional Error type.

I recommend this syntax (eventDetails seems to be unused)

func validateEventPasscode(){
    //Show Loading
    self.view.squareLoading.start(0.0)

    let api = APIService ()

    api.validatePasscode(eventcode: eventCode) { (data, error) in
        if let networkError = error {
            if networkError == .InvalidCredentials {
                _ = SCLAlertView(appearance: appearance).showError("Ooops!", subTitle: "Please enter a valid event passcode")
            } else {
                _ = SCLAlertView(appearance: appearance).showError("Network Error", subTitle: "\(networkError.rawValue)")  
            }
        } else {
            self.view.squareLoading.stop(0.0)
        }
    }
}

Upvotes: 0

Related Questions