[英]Swift Array holding elements weakly
我從中汲取了一些靈感
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 }
}
}
現在,當調用緊湊方法時,我可以清理數組,以防需要清理東西。
我現在遇到一些編譯問題,難以理解。 假設我有一個示例課
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()
當我嘗試調用緊湊型計算機時,出現以下錯誤消息:
MyPlayground.playground:29:21: 'WeakRefContainer<SampleClass>' is not a subtype of 'WeakRefContainer<AnyObject>'
誰能解除我的封鎖? 謝謝
您的代碼無法正常運行,因為WeakRefContainer<SampleClass>
不是WeakRefContainer<AnyObject>
的子類,因為泛型在Swift中是不變的。 因此, weakReferencesArray
無法使用擴展中添加的compact
方法。
通過協議可以解決此問題:
protocol WeakHolder {
var hasRef: Bool { get }
}
extension WeakRefContainer: WeakHolder {
var hasRef: Bool { return value != nil }
}
extension Array where Element: WeakHolder {
func compacted() -> [Element] {
return filter { $0.hasRef }
}
mutating func compact() {
self = compacted()
}
}
為了更好的Swift語義,我還把compact
重命名為compacted
,並用一個變異版本替換了原來的compact
。
您可能希望擴展名適用於所有[WeakRefContainer<T>]
,其中T
可以是擴展AnyObject
任何類型。
extension Array where Element: WeakRefContainer<T> {
但是,當前無法進行參數化擴展。 看到這個建議 。
您可以通過使compact
泛型來解決此問題:
extension Array{
func compact<T>() -> [Element] where Element == WeakRefContainer<T> {
return filter { $0.value != nil }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.