Com*_*ast 9 return swift swift2
请考虑以下代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我想在return语句之后实际运行self.process(textField),因为在它之前,textField中的文本还没有实际更改.这让我想知道,为什么我不能只在return语句后执行一些代码?为什么函数总是在return语句发生时停止?
我意识到传统上回归意味着什么,但还有其他选择吗?比如,有没有办法从函数中返回一个值,然后仍然继续?
一方面,这似乎是一个愚蠢的问题,但另一方面,我觉得我不能成为第一个想做这件事的人.如果我可以在运行循环的下一个循环中运行某些东西就足够了,所以也许GCD中有些东西可以帮助我.
jos*_*vhn 11
从Swift 2.0开始,我们有一个名为"defer"的关键字.一个关键字,允许我们指定一个代码块,我们的函数中的一个段,它将在程序控制转移到作用域之外之前执行.可能是为了清理或其他需求,即使抛出错误也需要执行操作.
延迟块内的代码执行被推迟到执行倒数第二个语句,假设最后一个是return语句的情况.
以下是如何使用它:
func anyFunction(someParameter: Int) -> Int {
// Some code
defer {
// Code to be deferred.
}
return someValue
} // anyFunction
Run Code Online (Sandbox Code Playgroud)
延迟块的位置应该放在花括号内的任何位置,并且总是在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 */) {
DispatchQueue.main.async {
print("about to process textField, timestamp: \(Date().timeIntervalSince1970)")
self.process(textField)
}
print("about to return true, timestamp: \(Date().timeIntervalSince1970)")
return true
}
else {
return false
}
}
Run Code Online (Sandbox Code Playgroud)
DispatchQueue.main.async将推迟执行到运行循环的下一次迭代。通过这些print()语句,您将在控制台中看到这一点。您的时间戳会有所不同,但您会看到微小的差异(在本例中约为 15/1000 秒)。
即将返回true,时间戳:1612578965.103658
即将处理textField,时间戳:1612578965.1188931
如果您需要特定的延迟使用DispatchQueue.main.asyncAfter
我找到的对此最好的解释是 Matt Neuburg 的书《iOS 14 Programming Fundamentals with Swift》。请参阅延迟性能部分。
| 归档时间: |
|
| 查看次数: |
3191 次 |
| 最近记录: |