Ios UIAlertAction闭包中设置的Inout变量未更改值

Ios UIAlertAction闭包中设置的Inout变量未更改值,ios,swift,closures,Ios,Swift,Closures,我有一个带有inout参数的函数:已启用:Bool 我正在引用的对象(我知道inout从技术上讲不是引用…),并且使用此方法的设置是UIViewController var enabled=false 我有多个布尔触发不同的东西,我想用一种方法来设置它们 因此,我将该方法称为: self.determineeEnabled(&self.enabled) 下面是代码,我用注释来解释发生了什么 代码: 我的应用程序显然比这段代码更复杂,但我可以验证这段代码中是否存在此问题 老实说,我并没有像我想的那

我有一个带有
inout
参数的函数:
已启用:Bool
我正在引用的对象(我知道
inout
从技术上讲不是引用…),并且使用此方法的设置是
UIViewController
var enabled=false

我有多个布尔触发不同的东西,我想用一种方法来设置它们

因此,我将该方法称为:

self.determineeEnabled(&self.enabled)

下面是代码,我用注释来解释发生了什么

代码:

我的应用程序显然比这段代码更复杂,但我可以验证这段代码中是否存在此问题

老实说,我并没有像我想的那样完全理解闭包

但是如果我可以使用
self.enabled
正确更改enabled的值,那么是什么阻止swift更改inout enabled变量的设置呢

更新:

这里有一个文档链接专门提到我的问题:

闭包或嵌套函数的末尾没有复制输出。这意味着如果在函数返回后调用闭包,闭包对in-out参数所做的任何更改都不会复制回原始值

这一主题的迅速发展:
在Swift中,函数是闭包。闭包捕获状态。当我们遇到包含代码
print(self.enabled)
的匿名函数时,
self.enabled
true
。我们知道这一点,因为如果没有,我们根本就不会在这里(我们将处于条件的第一翼,
if enabled==false
)。因此,当以后实际执行
print(self.enabled)
时,它将打印
true
,因为这是它捕获其值时的状态。

在Swift中,函数是闭包。闭包捕获状态。当我们遇到包含代码
print(self.enabled)
的匿名函数时,
self.enabled
true
。我们知道这一点,因为如果没有,我们根本就不会在这里(我们将处于条件的第一翼,
if enabled==false
)。因此,当以后实际执行
print(self.enabled)
时,它将打印
true
,因为这是它捕获其值时的状态。

您在问题中自己说过

我知道inout在技术上不是一个参考资料

从苹果的书中

in-out参数具有传入函数的值, 由函数修改,并从函数中传回 替换原始值

您正在修改闭包中的值,该闭包将在用户与警报交互时执行。此时,
determinateEnabled
已经返回并存储了
inout
参数的值

如果
inout
参数是一个引用,如C型指针,则
enabled
将指向存储
self.enabled
的内存块,并且在闭包中修改值时,将修改
self.enabled


如果创建一个具有布尔属性的简单类,然后将该类的实例传递给
determiniteEnabled
函数(不使用
inout
),则可以看到这是如何工作的。由于对象是通过引用传递的,因此在使用相同对象引用的任何地方都可以看到对闭包中对象属性的后续更新

你在问题中自己说的

我知道inout在技术上不是一个参考资料

从苹果的书中

in-out参数具有传入函数的值, 由函数修改,并从函数中传回 替换原始值

您正在修改闭包中的值,该闭包将在用户与警报交互时执行。此时,
determinateEnabled
已经返回并存储了
inout
参数的值

如果
inout
参数是一个引用,如C型指针,则
enabled
将指向存储
self.enabled
的内存块,并且在闭包中修改值时,将修改
self.enabled


如果创建一个具有布尔属性的简单类,然后将该类的实例传递给
determiniteEnabled
函数(不使用
inout
),则可以看到这是如何工作的。由于对象是通过引用传递的,因此在使用相同对象引用的任何地方都可以看到对闭包中对象属性的后续更新

我不认为有可能给出这样的答案:我以前也问过一个问题?关于一个方法的框架对于一个长时间执行的闭包总是可用的,这是事实,但是参数现在是常数,我认为如果给出这个答案,这是不可能的:我之前也问过一个问题?关于一个方法的框架对于一个长时间执行的闭包总是可用的,确实如此,但是参数现在是常量,非常好地解释了,ty!谢谢你的澄清。但是,无论如何,uialertaction处理程序都无法更改已启用的输入。因此,如果我在十分钟后检查,结果仍然相同。一旦在“if enabled==false”中发送到true,该属性就不会更改。我们已经捕获了该值。当你在别处更改它时,它不是“活的”。你可能会发现我的这个讨论很有趣:@matt我很好奇,你提到你会在开发论坛中发布它。你最终这样做了吗?我承认我有点困惑,斯威夫特没有办法做到这一点。很好地解释了,泰!谢谢你的澄清。但是,无论如何,uialertaction处理程序都无法更改已启用的输入。所以,如果我是切赫
func determineEnabled(inout enabled: Bool) {

    if enabled == false {
        enabled = true
   //self.enabled equals true now. This works. Its not in a closure...
    } else {

        let delete = UIAlertAction(title: "Disable", style: .Destructive, handler: { (action) -> Void in

            enabled = false
            print(self.enabled)
            //This doesn't work. the inout variable equals FALSE
            //self.enabled equals true
            //If I set self.enabled = false.. Then it works, but I'm using a method because my app could have dozens of these enabled bools on this view controller.

        let alertController = UIAlertController(title: "Change Bool", message: "", preferredStyle: UIAlertControllerStyle.Alert)

        alertController.addAction(delete)
        self.presentViewController(alertController, animated: true, completion: nil)
    }
}