如果我必须让目标对象在 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)
}
但我无法理解或猜测您真正想用您的代码做什么...
有时,我必须让 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)
}
但我无法理解或猜测您真正想用您的代码做什么...