当前位置: 首页 > 面试题库 >

Swift 1.2中的@noescape属性

史烈
2023-03-14
问题内容

Swift 1.2中有一个新属性,函数中带有闭包参数,如文档所述:

这表明该参数仅被调用(或在调用中作为@ noescape参数传递),这意味着它不能超过调用的生命周期。

以我的理解,在此之前,我们可以[weak self]不让闭包强烈引用其类,而self可以为nil或执行闭包时的实例,但是现在,这@noescape意味着闭包将永远不会执行如果该课程取消了初始化。我理解正确吗?

如果我是@noescape对的,当它们的行为非常相似时,为什么要使用由常规函数插入的闭包呢?


问题答案:

@noescape 可以这样使用:

func doIt(code: @noescape () -> ()) {
    /* what we CAN */

    // just call it
    code()
    // pass it to another function as another `@noescape` parameter
    doItMore(code)
    // capture it in another `@noescape` closure
    doItMore {
        code()
    }

    /* what we CANNOT do *****

    // pass it as a non-`@noescape` parameter
    dispatch_async(dispatch_get_main_queue(), code)
    // store it
    let _code:() -> () = code
    // capture it in another non-`@noescape` closure
    let __code = { code() }

    */
}

func doItMore(code: @noescape () -> ()) {}

添加@noescape保证闭包不会存储在某个地方,以后使用或异步使用。

从调用者的角度来看,无需关心捕获变量的生存期,因为它们是在调用函数中使用还是根本不使用。另外,我们可以使用隐式self,从而避免键入self.

func doIt(code: @noescape () -> ()) {
    code()
}

class Bar {
    var i = 0
    func some() {
        doIt {
            println(i)
            //      ^ we don't need `self.` anymore!
        }
    }
}

let bar = Bar()
bar.some() // -> outputs 0

另外,从编译器的角度来看(如发行说明中所述):

这样可以进行一些次要的性能优化。



 类似资料:
  • 概要 <#escape identifier as expression> ... <#noescape>...</#noescape> ... </#escape> 描述 当你使用escape指令包围模板中的一部分时,在块中出现的插值 (${...}) 会和转义表达式自动结合。这是一个避免编写相似表达式的很方便的方法。 它不会影响在字符串形式的插值(比如在 <#assign x

  • 问题内容: 我已经看到过这种表示法使用了很多东西,我想知道,这两种表示法之间有什么显着区别吗? 和 我一直都在使用,因为我觉得它看上去更干净,但是我不太确定浏览器的解释是否不同于。 有谁知道哪个更好或更正确? 问题答案: 当单位为时,虽然单位是可选的,但我倾向于将其保留,因为然后我可以使用Chrome的开发者工具通过点击值并按向上/向下箭头键来调整值。没有单位,这实际上是不可能的。 此外,CSS缩

  • 问题内容: 我为该标题表示歉意。我找不到更好的方法来解释这种情况。 我使用URL http://www.exampledepot.com/egs/java.util/Props.html中所述的Property类加载属性文件。 我的问题是我可以在该属性文件中使用属性吗? 例: test.properties 其他语法有可能吗? 谢谢 问题答案: 以前从未见过。您当然 可以 制作自己的预处理器。只要

  • 问题内容: 因此,直到最近,我还是故意为自己保留Java n00b,而我的第一次实际接触却引起了轻微的震惊:Java没有C#样式属性! 好吧,我可以接受。但是,我也可以保证已经在一个代码库中看到了Java中的属性获取器/设置器代码,但是我不记得在哪里。那是如何实现的?是否有语言扩展?它与NetBeans有关吗? 问题答案: Java中有一个用于getter和setter的“标准”模式,称为Bean

  • 本文向大家介绍C#中的StringBuilder.Chars []属性,包括了C#中的StringBuilder.Chars []属性的使用技巧和注意事项,需要的朋友参考一下 StringBuilder.Chars []属性在此实例中获取或设置字符在指定字符位置。 语法 语法如下- 在上方,索引参数是字符的位置。 示例 现在让我们看一个例子- 输出结果 这将产生以下输出- 示例 现在让我们来看另一

  • 有人能解释一下unicodePwd属性在AD中是如何工作的吗。 具体来说,当我打开“ADSI编辑器”,然后打开一个用户属性并查看属性时,“UnicodePwd”属性显示为“未设置”。事实上,用户确实有密码。密码是存储在这里的吗? 此外,我可以通过右键单击用户并选择重置密码来重置用户密码...但是如果我尝试通过更新UnicodePwd来设置,使用正确的十六进制,并且我很确定使用正确的复杂性,我会得到