Swift:错误将 self 作为 inout 参数传递

Posted

技术标签:

【中文标题】Swift:错误将 self 作为 inout 参数传递【英文标题】:Swift: error passing self as inout parameter parameter 【发布时间】:2014-08-03 10:38:38 【问题描述】:

我有这种情况:

class classA
  var objB : classB;

   init()
      objB = classB(&self) //ERROR!
  


class classB
 var _objA : classA

  init(inout objA : classA)
      _objA = objA;
  

我收到消息:“classA”不是“@lvalue $T3”的子类型

【问题讨论】:

【参考方案1】:

该错误具有误导性,但您的程序不应编译:将self 作为输入输出参数传递是没有意义的。 Swift 书很清楚什么可以传递为inout

您只能将变量作为 in-out 参数的参数传递。

这很有意义:想象一下,如果您的函数为其objA 参数分配一个新值会发生什么。由于它对应于调用者中的self,所以调用者对象需要被替换为一个新的对象,它没有明确的语义。

您可以通过为self 定义一个临时变量来解决此问题,如下所示:

var temp = self;
objB = classB(&temp)

【讨论】:

谢谢,不知道你描述的操作没有清晰的系统。 @user3903647 想想当initobjA 赋值时会发生什么,objA 绑定到self:这意味着所有引用旧self 的变量都必须重新- 指向替换对象。一旦考虑到某些引用可能来自常量对象,这种语义就变得不可能了。您是否使用本地 temp 变量尝试过这个? 虽然这很有道理,但是如何发送一个要配置的对象呢?例如,我想根据它遵守的协议将我的对象发送到“注入器”类以注入它的依赖项。我在 Objective C 中使用的模式是让 init 方法为 self 调用 Injector,然后 Injector 将为缺少的依赖项调用 setter。我如何在 SWIFT 中做到这一点? @Fervus 您可能想将此作为一个单独的问题提出。

以上是关于Swift:错误将 self 作为 inout 参数传递的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 错误:转义闭包只能按值显式捕获 inout 参数

Swift 4 编程语言,输入参数不适用于函数类型作为参数

如何解决转义闭包捕获 Swift 中的“inout”参数?

swift 无法将类型“[Liquor]”的值转换为预期的参数类型“inout _”

Swift 5:转义闭包捕获'inout'参数

Swift:具有通用函数和约束的 inout