iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – Swift:捕获逃脱被调用函数的闭包中的inout参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_674_0@
@H_674_0@
我试着编写一个“编辑器”类,它可以保留对不同对象上的属性的引用,以便以后进行突变.我首先编写了编辑器类来接收一个用于读取的闭包,以及一个用于写入的闭包.这很有效.然后我尝试通过(inout)引用传递有问题的参数,然后从中生成getter / setter对.这没用. Swift文档确实说(释义) Swift确定何时复制,何时不复制.我认为我反对这种限制的不可预测性,但我认为我提出的问题是一样的.

或者,是否可以为个人吸气剂和定位器获得咖喱功能

我的代码是:

class SomeModel : Printable {

    var a:string

    init(a:string) {
        self.a = a
    }

    var description:string {
        return "\(self.a)"
    }
}


class Editor {

    var getter:()-> String
    var setter:(String)->()

    init(getter:()-> String,setter:(String)->()) {
        self.getter = getter
        self.setter = setter
    }

    convenience init(inout bindTo:string) {
        self.init(
            getter:{ return bindTo },setter: { v in bindTo = v })
    }

    func read() -> String {
        return self.getter()
    }

    func write(value:string) {
        self.setter(value)
    }
}


func TESTBindTo() {
    var readModel =  SomeModel(a:"Did not capture by reference");
    var bindForReading = Editor(bindTo: &readModel.a)
    readModel.a = "captured by reference!"
    println(bindForReading.read())

    var writeModel =  SomeModel(a:"Did not capture by reference");
    var bindForWriTing = Editor(bindTo: &writeModel.a)
    bindForWriTing.write("captured by reference")
    println(writeModel)
}

TESTBindTo()


func testExplicitGetterSetter() {

    var readModel =  SomeModel(a:"Did not capture by reference");
    var bindForReading = Editor(
        getter: { readModel.a },setter: { v in readModel.a = v })
    readModel.a = "captured by reference!"
    println(bindForReading.read())

    var writeModel =  SomeModel(a:"Did not capture by reference");
    var bindForWriTing = Editor(
        getter: { writeModel.a },setter: { v in writeModel.a = v })
    bindForWriTing.write("captured by reference")
    println(writeModel)     
}

testExplicitGetterSetter()

结果是:

Did not capture by reference
Did not capture by reference
captured by reference!
captured by reference

谢谢!

解决方法

我不认为这是可能的.如果你想的话,它应该是不可能的,因为它会超级不安全.

因为闭包可以比它们创建的范围更长,所以捕获的变量必须与块一起存储.但是为了能够分配给捕获的变量并在捕获它的(一个或多个)块和原始范围之间共享该变量的状态,这些块不能只捕获变量的值(将创建变量的独立副本),但捕获一种对共享副本的“引用”.这意味着必须特别存储由块捕获的可分配变量.在Objective-C中,这是用__block声明的.在Swift中,这个__block行为是隐含的.

但是,为了使块能够在函数调用者的作用域中看到修改inout变量(可能在稍后的时间),这意味着调用者作用域中传递的变量也需要以这样的方式存储:可以比堆栈帧寿命更长.但调用函数不知道这一点.根据被调用函数的类型,它所知道的是它的一个参数是inout;它不知道该函数计划捕获块中的inout变量.所以它不知道为这个传递的变量准备这个__block存储.

@H_674_0@

大佬总结

以上是大佬教程为你收集整理的ios – Swift:捕获逃脱被调用函数的闭包中的inout参数全部内容,希望文章能够帮你解决ios – Swift:捕获逃脱被调用函数的闭包中的inout参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:inoutiosswift函数参数捕获调用逃脱闭包
猜你在找的iOS相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap