簡體   English   中英

快速數組保持元素弱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM