【问题标题】:Swift: error passing self as inout parameter parameterSwift:错误将 self 作为 inout 参数传递
【发布时间】:2025-12-25 02:10:12
【问题描述】:

我有这种情况:

class classA{
  var objB : classB;

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

class classB{
 var _objA : classA

  init(inout objA : classA){
      _objA = objA;
  }
}

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

【问题讨论】:

    标签: swift


    【解决方案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 您可能想将此作为一个单独的问题提出。