2017-03-12 4 views
-1

ユーザが登録情報を記入する際にエラーを処理するために使用する、別のスウィフトファイルで宣言した拡張子があります。しかし、私のデバッグでStringを返す代わりに、エラーに応じて表示するためにアラートやimageViewsを使用したいと思っています。問題は、IBOutletをどのように渡したり、この拡張のリターンセクションでアラートを作成したりすることができないか分かりません。たとえば、firstNameが空の場合、firstNameテキストフィールドの近くに赤丸の警告(imageView)が表示されます。エラーを処理する私のアーキテクチャが間違っているのかもしれないし、多分それを行う方法がありますか?拡張エラーハンドラ

解決策を見つけるための正しい方向を教えていただければ幸いです。ここで

はここで拡張

import UIKit 

enum RegistrationErrors: Error { 
    case invalidFirstName 
    case invalidLastName 
    case invalidCountry 
} 

extension RegistrationErrors: CustomStringConvertible { 
var description: String { 
    switch self { 
    case .invalidFirstName: 
     return "FirstName cannot be empty" 

    case .invalidLastName: 
     return "LastName cannot be empty" 

    case .invalidCountry: 
     return "Country cannot be empty" 
    } 
} 

}

であるあなたのRegistrationErrors CustomStringConvertible拡張子は悪い考えではありません、私はこの拡張機能を使用する私のコード

func registrationUser(firstName: String, lastName: String, country: String) throws -> (String, String, String) { 
    guard let firstName = firstNameTextField.text , firstName.characters.count != 0 else { 
     throw RegistrationErrors.invalidFirstName 
    } 

    guard let lastName = lastNameTextField.text , lastName.characters.count != 0 else { 
     throw RegistrationErrors.invalidLastName 
    } 

    guard let country = countryTextField.text , country.characters.count != 0 else { 
     throw RegistrationErrors.invalidCountry 
    } 

    return (firstName, lastName, country) 
} 

// MARK: Actions 

@IBAction func continueBtnTapped(_ sender: Any) { 

    do { 
     let (firstName, lastName, country) = try registrationUser(firstName: firstNameTextField.text!, lastName: lastNameTextField.text!, country: countryTextField.text!) 
     if let currentUser = FIRAuth.auth()?.currentUser?.uid { 
      DataService.instance.REF_BASE.child("users").child("profile").setValue(["firstName": firstName, "lastName": lastName, "country": country, "userId": currentUser]) 
      performSegue(withIdentifier: "toUsersList", sender: self) 
     } 
    } catch let error as RegistrationErrors { 
     print(error.description) 
    } catch { 
     print(error) 
    } 
} 
+0

関連:http://stackoverflow.com/questions/39176196/how-to-provide-a-localized-description-with-an-error-type-in​​-swift –

+0

@MartinR実際、私はこれをその複製とみなすことを考えていました。私がしなかった唯一の理由は、これがOPが求めていたものかどうかは完全にはっきりしていなかったことです。 – matt

答えて

0

エラーからエラーを派生させる代わりに、LocalizedErrorから派生させてください。これは、あなたがerrorDescriptionプロパティを提供することができます、あなたが好きなら、あなたも、後でそれをローカライズすることができます

enum RegistrationErrors: LocalizedError { 
    case invalidFirstName 
    case invalidLastName 
    case invalidCountry 
    var errorDescription : String? { 
     switch self { 
     case .invalidFirstName: return NSLocalizedString(
      "First name cannot be empty", comment:"First name cannot be empty") 
     case .invalidLastName: return NSLocalizedString(
      "Last name cannot be empty", comment:"Last name cannot be empty") 
     case .invalidCountry: return NSLocalizedString(
      "Country cannot be empty", comment:"Country cannot be empty") 
     } 
    } 
} 

これは、エラーのlocalizedDescriptionキャッチポイントで次のようになります。

do { 
    throw RegistrationErrors.invalidLastName 
} catch { 
    let problem = error.localizedDescription 
    // "Last name cannot be empty" 
    // ... now present your alert ... 
} 

は、これは普遍的なソリューションです。特別なコードは必要ありません。キャッチポイントはエラーの余分なプロパティを意識する必要はなく、ローカライズされた説明だけがNSErrorバージョンに継承されるため、キャッチポイントがObjective-Cコードであっても機能します。

+0

ありがとうございます! – Sargot

0

です。私は、do..catchブロックでユーザーにエラーを表示することを処理したいと思うでしょう。

あなたが好きな特定のエラーをキャッチすることができます:

do { 
    ... try registerUser(...) 
} catch RegistrationErrors.invalidFirstName { 
    view.invalidFirstName() 
} catch ... 

あなたはそれがRegistrationErrorあるときにも、エラーをキャプチャあなたがやっているように、スイッチで特定のエラーを処理することができます

// ... 
catch let error as RegistrationErrors { 
    print(error) 
    switch error { 
    case .invalidFirstName: 
     view.invalidFirstName() 
    // ... 
    } 
+0

ありがとうございました! – Sargot