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 想想当init
给objA
赋值时会发生什么,objA
绑定到self
:这意味着所有引用旧self
的变量都必须重新- 指向替换对象。一旦考虑到某些引用可能来自常量对象,这种语义就变得不可能了。您是否使用本地 temp
变量尝试过这个?
虽然这很有道理,但是如何发送一个要配置的对象呢?例如,我想根据它遵守的协议将我的对象发送到“注入器”类以注入它的依赖项。我在 Objective C 中使用的模式是让 init 方法为 self 调用 Injector,然后 Injector 将为缺少的依赖项调用 setter。我如何在 SWIFT 中做到这一点?
@Fervus 您可能想将此作为一个单独的问题提出。以上是关于Swift:错误将 self 作为 inout 参数传递的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3.0 错误:转义闭包只能按值显式捕获 inout 参数