2016-03-20 4 views
4

Betrachten Sie den folgenden Code ein:Wie kann ich Code nach der return-Anweisung in einer Funktion in Swift ausführen?

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 
    } 
} 

Ich mag eigentlich self.process (Textfield) nach der Rückkehr Anweisung ausgeführt ist, weil vor, der Text in dem Textfeld nicht tatsächlich noch geändert. Dies führte mich zu der Frage, warum kann ich nicht einfach Code nach die Rückkehr Anweisung ausführen? Warum stoppen Funktionen immer, wenn die return-Anweisung passiert?

Ich realisiere das ist traditionell, was Rückkehr bedeutet, aber gibt es eine Alternative? Wie, gibt es eine Möglichkeit, einen Wert von einer Funktion zurückzugeben und dann weiter zu machen?

Auf der einen Seite scheint das eine dumme Frage zu sein, auf der anderen Seite fühle ich mich, als ob ich nicht der erste Mensch sein könnte, der das jemals tun möchte. Es wäre gut genug, wenn ich etwas abfeuern könnte, um im nächsten Zyklus der Laufschleife zu laufen, also vielleicht gibt es etwas in GCD, das mir helfen würde.

+0

Google für Grand Central Dispatch – gnasher729

Antwort

0

Es gibt kein Sprachenprimitiv, um nach einer return-Anweisung beliebigen Code auszuführen. Keine Sprache bietet dies. Sie können jedoch immer Closures verwenden, um den Codefluss einzubetten und zu sequenzieren. wie ein Completion-Handler. In einigen Fällen möchten Sie möglicherweise willSet und/oder didSet verwenden. Stellen Sie sich vor, Sie hätten eine String-Eigenschaft, die ein Sicherungsspeicher für Ihr Textfeld ist. Wenn die Zeichenfolge validiert ist, schreiben Sie in den Sicherungsspeicher. Das löst dann willSet aus, die Ihren process-Code ausführen und das textField direkt abhängig von den Ergebnissen aktualisieren kann.

1

Ich denke, Sie müssen Ihren Prozesscode auf eine andere Funktion verschieben.

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

Seit Swift 2.0 haben wir das Stichwort "Defer". Mit diesem Schlüsselwort können Sie einen Codeblock angeben, der bei Beendigung der aktuellen Funktion, für Bereinigungsaktionen oder für andere Zwecke ausgeführt wird. Dieser Codeblock wird zurückgestellt, bis die letzte Anweisung ausgeführt wird, unabhängig davon, ob es sich um eine Rückgabeanweisung oder eine andere Anweisung handelt.

Hier ist, wie Sie es verwenden können:

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. 

    } 

} 

Die Position des „verschieben“ Block nicht am Ende der Funktion sein muss, könnte es überall innerhalb der geschweiften Klammern sein.

0

Defer Injektionen sollten bei den erreichbaren Anweisungen des Codes sein, andernfalls werden sie am Ende des Blocks nicht ausgeführt. Grundsätzlich ist es der Grundgedanke von Defer.