2017-09-11 9 views
1

同じクラスで列挙型の関数内で関数を呼び出すシナリオは次のとおりです。私は3迅速 にenumの関数内の関数を呼び出すために持っていたところ、私はシナリオに出くわした

class SomeViewController: UIViewController { 

enum Address { 
    case primary 
    case secondary 

    func getAddress() { 

     let closure = { (text: String) in 
      showAlert(for: "") 
     } 
    } 
} 

func showAlert(for text: String) { 
    let alertController = UIAlertController(title: text, message: nil, preferredStyle: .alert) 
    alertController.addAction(UIAlertAction(title:NSLocalizedString("OK", comment:"OK button title"), style: .cancel, handler: nil)) 
    present(alertController, animated: true, completion: nil) 
} 

} 

あなたが見ることができるように上記のコードからIは、ライン上のエラーを取得し10 (showAlert(for: ""))

エラーがある:

インスタンス部材showAlertを型SomeViewControllerに使用することができません。代わりにこのタイプの値を使用することを意味しましたか?

どのようにしてenumの関数から関数を呼び出すことができますか?

答えて

2

代替アプローチ:

あなたはalertを提示するSomeViewControllerstatic methodを使用することができます。

例:それを使用して

static func showAlert(for text: String) 
{ 
    let alertController = UIAlertController(title: text, message: nil, preferredStyle: .alert) 
    alertController.addAction(UIAlertAction(title:NSLocalizedString("OK", comment:"OK button title"), style: .cancel, handler: nil)) 
    UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil) 
} 

enum Address 
{ 
    case primary 
    case secondary 

    func getAddress() 
    { 
     let closure = { (text: String) in 
      SomeViewController.showAlert(for: "") 
     } 
     closure("hello") 
    } 
} 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    let addr = Address.primary 
    addr.getAddress() 
} 
1

enumはインスタンスを知らないため、メンバーにアクセスできません。この状況に対処する1つのアプローチは、クライアントにenumが何か問題が生じたことを知らせることです。

class SomeViewController: UIViewController { 
    enum Address { 
     case primary 
     case secondary 

     func getAddress() -> String? { 
      //allGood == whatever your logic is to consider a valid address 
      if allGood { 
       return "theAddress" 
      } else { 
       return nil; 
      } 
     } 
    } 

    func funcThatUsesAddress() { 
     let address = Address.primary 
     guard let addressString = address.getAddress() else { 
      showAlert(for: "") 
      return 
     } 
     // use your valid addressString here 
     print(addressString) 

    } 

    func showAlert(for text: String) { 
     let alertController = UIAlertController(title: text, message: nil, preferredStyle: .alert) 
     alertController.addAction(UIAlertAction(title:NSLocalizedString("OK", comment:"OK button title"), style: .cancel, handler: nil)) 
     present(alertController, animated: true, completion: nil) 
    } 
} 
+0

これは私のケースを解決するが、何かの機能が無効であるか、あなたがこのenumの機能を呼び出す必要があります様々な場所? –

関連する問題