- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在寻找 Swift 中自动闭包和转义闭包的一些区别/目的。我很清楚转义闭包是我们想要在函数返回后执行的东西,但我没有得到自动闭包的概念。
最佳答案
I didn't get the concept of autoclosure closure.
autoclosure 允许函数将表达式包装在闭包中,以便稍后执行或根本不执行。
使用自动关闭 的一个很好的例子是 short-circuit ||
发生的行为。
考虑这个例子:
func willCrash() -> Bool {
fatalError()
return true
}
let good = true
if good || willCrash() {
print("made it")
}
输出:
made it
||
运算符使用短路求值:首先求值左侧 (lhs),只有当 lhs 求值为 false 时才求值右侧 (rhs)。
那么,它是如何实现的呢?好吧,||
只是一个函数,它接受两个参数,每个参数的计算结果都是一个 Bool
并且 ||
将它们组合起来返回一个 bool
。但在 Swift 中函数的正常调用方案中,参数在调用函数之前被求值。如果 ||
以显而易见的方式实现:
func ||(lhs: Bool, rhs: Bool) -> Bool {
return lhs ? true : rhs
}
它会因为在 ||
被调用之前执行 willCrash()
而崩溃。所以 ||
使用 autoclosure 将第二个语句包装在一个闭包中,这样它就可以延迟评估直到在 ||
函数中。如果第一个语句(在调用 ||
之前评估)是 true
那么 ||
的结果是 true
并且不调用闭包,从而避免了本例中的崩溃。
这里是||
的定义:
static func ||(lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool
Description Performs a logical OR operation on two Bool values. The logical OR operator (||) combines two Bool values and returns true if at least one of the values is true. If both values are false, the operator returns false.
This operator uses short-circuit evaluation: The left-hand side (lhs) is evaluated first, and the right-hand side (rhs) is evaluated only if lhs evaluates to false.
忽略 throws/rethrows 这是另一个主题,||
的实现变为:
func ||(lhs: Bool, rhs: @autoclosure () -> Bool) -> Bool {
return lhs ? true : rhs()
}
和 rhs()
仅在 lhs == false
时调用。
关于swift - Swift 中 auto 和 escaping 闭包的区别和目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45658608/
一个简单的GNU m4问题,但是我找不到正确的答案。我想在代码部分的开始/结束处打印一个markdown header : ``` echo Hello ``` 如何创建包含3个反引号的GNU M4宏
我有一个 shell 变量(我们将调用 x),其中包含一个带有 shell 元字符的字符串。例如,我可能有 abc "def's" ghi 设置为 x='abc "def'\''s" ghi'
我有一个 shell 变量(我们将调用 x),其中包含一个带有 shell 元字符的字符串。例如,我可能有 abc "def's" ghi 设置为 x='abc "def'\''s" ghi'
执行以下行时: df = df[df['Directory'].str.contains("C:\Windows\System32\Tasks")] 我收到以下错误: File "/Users/pat
我正在使用 python-social-auth 从我的 Django 应用程序登录社交网络。在我的本地机器上一切正常,但是当我部署到服务器时出现以下错误: oauthlib.oauth1.rfc58
URI.escape 和 CGI.escape 有什么区别,我应该使用哪一个? 最佳答案 斧头和剑有什么区别,我应该使用哪一种?好吧,这取决于您需要做什么。 URI.escape 应该将字符串 (UR
我今天安装了 Zenwalk Linux。我发现 Escape 键没有绑定(bind)到任何东西(至少据我所知),而是 Escape 通常会做什么(关闭程序,打开 vim 命令行等)Shift-Esc
我遇到过一种情况,闭包可能在函数 f1 内部调用(闭包被传递到其中),或者可能会传递给其他函数 f2 >。 所以现在我想知道应该如何定义这个闭包的转义行为。我的意思是我应该放 @escaping 还是
在 js/jQuery 中有没有办法拥有这两种按键组合? ESCape 键 和 SHIFT + ESCape 键 当我实现它时使用: document.onkeydown = function(e){
我正在尝试将字符串中的任何换行符或转义换行符规范化为转义的 unix 换行符。我不明白为什么这不起作用: Pattern EOL = Pattern.compile("(\\\\r)?\\\\n|\r
swift 4.2,Xcode 10.1 在我正在处理的订单处理应用程序中,用户可以搜索已处理或提交的订单。发生这种情况时,它将检查是否有订单缓存,如果没有,它将使用异步 API 请求重新填充该缓存,
我的几个网页名称中包含以下字符&,例如“Shipping & Deliveries”等 我的架构标记注入(inject)了 GTM (JSON-LD),但在 SDTT 中我收到以下错误: Uncate
自版本 1.9.0 起,Twig为 escape 过滤器提供 html_attr 策略(参见 documentation )。 html 策略使用 htmlspecialchars PHP 函数(通过
我有一个像这样的 View Controller : class PublicationListViewController: UIViewController { var publicati
这是我的代码: class Main { init() { let x = Sub(s: foo) } func foo(completion: @escapi
我正在尝试将闭包用于一阶谓词演算,并且我打算定义以下函数: func ASSUM(p: @escaping Pred) -> (Pred) -> Pred { return { q in AN
我有关于 ezSQL_mysql 和 ezSQLcore 的问题,它可能是 PHP 版本不兼容,我分享下面的代码。我应该使用什么版本的 PHP 或者我应该做什么来定制 mysqli? (我的PHP版本
我有以下函数,其中有完成处理程序,但出现此错误: Closure use of non-escaping parameter may allow it to escape 这是我的代码: func m
我正在使用 Swift-VectorBoolean 库,它目前在 Swift 3.2 上,尚未针对 Swift 4.2 进行更新,但应该仍可在 Xcode 10 上运行。在 Xcode 9 上运行它,
我想用这个 ansible 命令在 nrpe.cfg 中插入一个 nrpe 命令 check_tomcat_threads.pl -H localhost -p 30011 -C '"http-bio
我是一名优秀的程序员,十分优秀!