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

强制解开在同一行代码中已选择访问的变量是否安全?

慕祯
2023-03-14
问题内容
someFunction(completion: { [weak self] in
    self?.variable = self!.otherVariable
})

总是 安全吗?我self在语句的开头访问可选内容,并且我个人认为如果selfis
,则该语句的第二部分将永远不会执行nil。这是真的?如果self确实是nil,第二部分将永远不会发生?self在这单行代码中,它永远不会被“消灭”吗?


问题答案:


来自“
Swift编程语言”的可选链接给出了以下示例:

 let john = Person()
 // ...
 let someAddress = Address()
 // ...
 john.residence?.address = someAddress

其次(强调):

在此示例中,尝试设置john.residence的地址属性将失败,因为john.residence当前为nil。

赋值是可选链接的一部分,这意味着 =运算符右侧的任何代码都不会被评估。

适用于您的案例:

self?.variable = self!.otherVariable

如果是, 则不 评估右侧。因此,您问题的答案self``nil

如果自我确实为零,那么第二部分永远不会发生?

是是的”。关于第二个问题

在这单行代码中,自我可能永远不会被“刺死”吗?

我最初的 假设 是,一旦self确定为!= nilself!则在评估语句的整个过程中都会使用强烈引用,因此不会发生这种情况。但是(如@Hamish所指出的),这不能保证。苹果工程师Joe
Groff 在Swift论坛中的确认操作顺序中写道:

这不能保证。可以对发布进行优化,使发布早于此,直到强引用最后一次正式使用之后的任何时候。由于此后weakProperty?.variable未使用为评估左侧而加载的强参考,因此没有任何东西可以使它存活,因此可以立即释放它。
如果getter变量中有任何副作用导致weakProperty取消引用的对象, 从而弱引用无效,那么这将导致右侧的强制展开失败。
您应使用if来测试弱引用,并引用由if let



 类似资料:
  • 我的要求是从网页发送whatsapp消息。因此,它应该是一个单一的页面,将有字段的移动号码,消息和发送按钮。 我从脸书找到了文档,我们需要为此获得whatsapp业务api。我还看到一些其他工具,如twilio来实现这一点。令人困惑的是,如果我们可以使用whatsapp业务api本身来实现它,为什么我们需要twilio所以,我的问题是,twilio或其他第三方工具真的需要访问whatsapp ap

  • 问题内容: 我有两个快速文件: 和 在main.swift中, 我最初设置为。 将I设置为,一切正常。 但是,如果我尝试通过 view 这样的简单调用从 view.swift进行 访问,则即使变量已更改,它也总是会获得,即使它在main.swift中也没有变化。 该方法在 main.swift 如下所示: 编辑 这是代码(翻译成意大利语:D) 在此先感谢Alberto 问题答案: Swift中的“

  • 我试图用vba做一个按钮来删除Excel表中的一行,但当我按下按钮并选择不止一行或许多单元格时,我想限制从E到I的选择(和行的数量无关)这里是我的代码,非常感谢,希望你能帮助我,我还没有找到任何类似的东西。

  • 问题内容: 因此,我正在编写此存储过程,而且我真的很喜欢SQL。 我对你们的问题是: 我可以选择整行并将其存储在变量中吗? 我知道我可以做类似的事情: 但是我可以从中选择整行并将其存储在变量中吗? 问题答案: 您可以将字段选择为多个变量: 另一种可能更好的方法是使用表变量: 然后,您可以像常规表一样从表变量中进行选择。

  • 问题内容: 我正在动态生成一个列表。我想使每行都悬停在鼠标悬停上并单击链接。我希望链接传递行内容的ID。 基本上: 问题出在js / jquery中。我希望能够抓住$ cid并在单击后将其传递给student.php页面。上面的php代码有效,但是js当然不会。我知道客户端语言和服务器端语言的基础。这个问题不值得上课。我知道我无法完全做到这一点,但这是我最终想要实现的目标。关于如何简单地实现此目标

  • 问题内容: 我一直在寻找一些Java基本集合(的宝库,fastutil,HPPC)和我已经注意到,类变量有时声明为图案的局部变量。例如: 我已经进行了一些基准测试,看来这样做时速度 稍 快,但是为什么会这样呢?我试图了解如果注释掉函数的前三行,那么Java将有何不同之处。 注意:这似乎与此问题相似,但这是针对c ++的,并且没有解决为什么声明它们的原因。 问题答案: 此处的关键字是红色鲱鱼。之所以