2016-09-04 4 views
0

swift2.2の条件に基づいてメソッド名を別のメソッド名に置き換える方法はありますか?迅速に条件に基づいてメソッド名を置き換える方法は?

例:上記の例では

if(self.RecivedString == "varMethod"){ 
    self.routes.varMethod(postData, andCompletionHandler: { (response, error) in 
       if(error.length == 0){ 
        if(response.valueForKey("status") as! NSInteger == 1){ 

         self.performSelectorOnMainThread(#selector(SubmitViewController.navigateToSubmissionViewController), withObject: nil, waitUntilDone: true) 
        }else{ 
         self.showalert(response.valueForKey("msg") as! String) 
        } 


       }else{ 
        self.showalert(error as String) 
       } 
      }) 


    } 

私は条件に他のself.routes.varMethodNew名ベースでself.routes.varMethod名を置き換えたいです。

+0

私はあなたが1つのメソッドを置き換えることはできませんが、目標を達成するために、新しいメソッド(varMethodNewなど)を1つ作成し、要件に基づいていくつかの条件に基づいて必要なメソッドを呼び出すことができます。 – Janmenjaya

答えて

0

メソッド名を別のメソッド名に置き換えることはできませんが、メソッドへの参照を保持するクロージャ変数を使用できます。あなたができる、

func someMethod(postData: NSData) { 
    //Declare a closure variable 
    let theMethod: (NSData, andCompletionHandler: Routes.CompletionHandler)->Void //<-Make this match to `varMethod` and `varMethodNew`. 
    if self.recievedString == "varMethod" { 
     theMethod = self.routes.varMethod 
    } else { 
     theMethod = self.routes.varMethodNew 
    } 
    //And call it 
    theMethod(postData, andCompletionHandler: { response, error in 
     if error == nil { 
      if response["status"] as! Int == 1 { 
       dispatch_async(dispatch_get_main_queue()) { 
        self.navigateToSubmissionViewController() 
       } 
      } else { 
       self.showAlert(response["msg"] as! String) 
      } 
     } else { 
      self.showAlert(error!.localizedDescription) 
     } 
    }) 
} 

しかし、あなたの場合:あなたのようにあなたのSubmitViewControllerに閉鎖変数を使用して、いくつかの方法を書くことができます

class Routes { 
    typealias CompletionHandler = ([String: AnyObject], NSError?)->Void 
    func varMethod(data: NSData, andCompletionHandler: CompletionHandler) { 
     //... 
    } 
    func varMethodNew(data: NSData, andCompletionHandler: CompletionHandler) { 
     //... 
    } 
} 

class SubmitViewController: UIViewController { 
    var routes: Routes = Routes() 
    var recievedString: String? 
    func showAlert(message: String) {/*...*/} 
    func navigateToSubmissionViewController() {/*...*/} 
    //... 
} 

:あなたはこのような2つのクラスを持っていると仮定し

完了ハンドラをクロージャ変数として定義します。

func someOtherMethod(postData: NSData) { 
    //Declare a closure variable 
    let completionHandler: Routes.CompletionHandler = { response, error in 
     if error == nil { 
      if response["status"] as! Int == 1 { 
       dispatch_async(dispatch_get_main_queue()) { 
        self.navigateToSubmissionViewController() 
       } 
      } else { 
       self.showAlert(response["msg"] as! String) 
      } 
     } else { 
      self.showAlert(error!.localizedDescription) 
     } 
    } 
    //And use it 
    if self.recievedString == "varMethod" { 
     self.routes.varMethod(postData, andCompletionHandler: completionHandler) 
    } else { 
     self.routes.varMethodNew(postData, andCompletionHandler: completionHandler) 
    } 
} 
関連する問題