如果我必须让目标对象在 Swift 中保持活动状态,如何抑制 "variable was never used" 警告?

How to suppress "variable was never used" warning if I have to keep the target object alive in Swift?

有时,我必须让 class 实例在没有显式命名引用的情况下保持活动状态。 例如,在这段代码中,编译器会报错。

let a = AAA()
// "... `b` never used" warning.
let b = a.bbb()
a.ddd(333)

但是如果我将 b 替换为 _,现在实例会立即终止并产生错误的结果。

let a = AAA()
// "... `b` never used" warning.
let _ = a.bbb()
a.ddd(333)

没有 let 关键字的相同结果。

let a = AAA()
// "... `b` never used" warning.
_ = a.bbb()
a.ddd(333)

这是重现这种情况的工作示例代码。

func eee() {
    final class AAA {
        weak var ccc: AAA?
        func bbb() -> AAA {
            let r = AAA()
            ccc = r
            return r
        }
        func ddd(_ value: Int) {
            // This side effect is what I want.
            print(value)
            ccc?.ddd(value)
        }
    }

    let a = AAA()
    // "... `b` never used" warning.
    let b = a.bbb()
    a.ddd(333)
    _ = b
}

eee()

如何通过保持实例活动来抑制警告?

我正在使用 Swift 4.1 包含在 Xcode 10.0.


编辑

这段代码只是一个简短的例子来说明情况。 class 的内容并不重要。我只想展示一个对象需要在没有明确引用的情况下存活的情况。

如果您对我的意图感到困惑,我很抱歉。除了显示问题外,代码中没有其他意图。我重命名了所有内容以删除含义。

老实说,我不明白你想用 Pipe1 实现什么 class。

关于您询问的参考问题,这是预期的行为。

使用 weak var continuation: Pipe1? 你只保留一个弱引用,所以你需要在其他地方有一个强引用。在你的情况下 let _ = a.extend() 正在为你做这件事。但是因为你想摆脱这个,你需要重新考虑你真正想要存储强引用的地方。

一种方式:

let a = Pipe1()
let b = a.extend()
a.push(333)
_ = b

另一种方式:

let a = Pipe1()
withExtendedLifetime(a.extend()) {
    a.push(333)
}

但我无法理解或猜测您真正想用您的代码做什么...