【发布时间】:2019-02-13 15:41:56
【问题描述】:
我从
中获得了一些灵感https://marcosantadev.com/swift-arrays-holding-elements-weak-references/
并且我希望能够维护一个数组,其中包含对其元素的弱引用,以便万一这些元素在我的代码库的其他地方被释放,我不会将它们保留在我的数组中。
我希望实现尽可能类型安全,但应该是可重用的。
我使用的策略是声明一个弱引用容器。
class WeakRefContainer<T> where T: AnyObject {
private(set) weak var value: T?
init(value: T?) {
self.value = value
}
}
然后我想维护这些WeakRefContainers的数组,所以我创建了一个数组扩展:
extension Array where Element: WeakRefContainer<AnyObject> {
func compact() -> [WeakRefContainer<AnyObject>] {
return filter { $0.value != nil }
}
}
当调用 compact 方法时,我现在可以清理数组以防需要清理内容。
我现在遇到了一些难以理解的编译问题。 假设我有一个示例类
class SampleClass {
}
我尝试按如下方式使用所有内容:
var weakReferencesArray = [WeakRefContainer<SampleClass>]()
let obj1 = WeakRefContainer.init(value: SampleClass())
let obj2 = WeakRefContainer.init(value: SampleClass())
weakReferencesArray.append(obj1)
weakReferencesArray.append(obj2)
weakReferencesArray.compact()
当我尝试调用 compact 时,我收到以下错误消息:
MyPlayground.playground:29:21: 'WeakRefContainer<SampleClass>' is not a subtype of 'WeakRefContainer<AnyObject>'
有人可以解封吗?谢谢
【问题讨论】:
-
你应该让你的
WeakRefContainer成为一个结构体。 -
我会避免在
Array上使用方法名称compact(),因为如果compactMap的身份映射版本被添加到标准库中,它很可能会被命名。
标签: arrays swift generics memory weak-references