2016-03-20 7 views
4

は、次のコードを考えてみましょう:Swiftの関数でreturnステートメントの後にコードを実行するにはどうすればよいですか?

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    let validator:NSPredicate = NSPredicate(format:"SELF MATCHES %@","[A-Za-z0-9- ]+") 
    if(validator.evaluateWithObject(string) || string == "" /* i.e. backspace */) { 
     self.process(textField) 
     return true 
    } 
    else { 
     return false 
    } 
} 

その前に、テキストフィールド内のテキストは、実際にはまだ変更されていないので、私は、実際にリターン文の後self.process(TextFieldを)実行したいです。これは私に不思議に思った、なぜ return文の後にいくつかのコードを実行できないのですか? return文が起きたときに関数が常に停止するのはなぜですか?

伝えられるところによると、を意味しますが、代替手段がありますか?同様に、関数から値を返す方法はありますか?

一方、これは愚かな質問のように思えますが、一方で、私はこれをやりたい最初の人にはなり得ないような気がします。実行ループの次のサイクルで何かを実行するために何かを消すことができれば十分ですが、GCDに役立つものがあるかもしれません。

+0

Google for Grand Central Dispatch – gnasher729

答えて

0

return文の後に任意のコードを実行する言語プリミティブはありません。これを提供する言語はありません。ただし、クロージャを使用してコードフローを埋め込み、シーケンス化することは常に可能です。完了ハンドラのように。

willSetおよび/またはdidSetを使用することもできます。テキストフィールドのバッキングストアであるStringプロパティがあるとします。文字列が検証された場合は、バッキングストアに書き込みます。これによりwillSetが起動され、processコードが実行され、結果に応じてtextFieldが直接更新されます。

1

あなたのプロセスコードを別の機能に移す必要があると思います。

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    print("view loaded") 
    textField.addTarget(self, 
     action: "textFieldDidChange:", forControlEvents: .EditingChanged) 
} 


func textFieldDidChange(textField: UITextField){ 
    print("text changed: \(theTextField.text)") 
    self.process(textField) 
} 
4

Swift 2.0以降、キーワード「defer」があります。このキーワードを使用すると、現在の関数が終了したときにクリーンアップアクションやその他のニーズのために実行されるコードブロックを指定できます。このコードブロックは、リターンステートメントであっても、他のステートメントであっても、最後のステートメントが実行されるまで延期されます。ここで

は、あなたがそれを使用することができます方法は次のとおりです。「延期」ブロックの位置は、関数の最後である必要はありません

func anyFunction(someParameter: Int) -> Int { 

    // Some code 

    return SomeValue 

    defer { 

     // This block will be executed at the end of this function and after all statements. 

    } 

} 

それはどこでも、中括弧内である可能性があります。

0

遅延注射は、コードの到達可能なステートメントのものでなければなりません。そうでなければ、ブロックの最後に実行されません。基本的に、その主な考え方は遅れている。

関連する問題