簡體   English   中英

關聯類型為class的協議的擴展?

[英]Extension of a protocol where the associatedType is class?

我試過這樣的事情:

protocol MyModelProtocol {
    var name: String { get set }
}

protocol MyProtocol {
    associatedtype Model: MyModelProtocol

    func changeModel(_ model: Model)
}

extension MyProtocol where Model: AnyObject {
}

編譯器很高興。 但是,在此擴展中,編譯器仍然不確定Model是類還是結構。 例:

extension MyProtocol where Model: AnyObject {
    func changeModel(_ model: Model) {
        model.name = "changed"
    }
}

因此,我得到錯誤:“無法分配給屬性:'model'是'let'常量”

如何告訴編譯器在該協議擴展中,關聯類型將始終是一個類?

順便說一句,這只是一個簡短的例子。 我知道在這種情況下我可以使用inout參數,但它對我不起作用,因為我想更改異步回調內的對象,如下所示:

func changeModel(_ model: inout Model, completion: @escaping () -> Void) {
        Api.shared.doRandomAsyncStuff() { (_) in
            model.name = "changed"
            completion()
        }
    }

並且嘗試這樣做會導致錯誤:“轉義閉包只能通過值明確捕獲參數”。

您可以只為var添加中間分配。 對於類/引用類型,這與在原始引用上設置屬性具有相同的效果。 對於結構類型,它會創建一個副本,這不起作用,但應該通過擴展的約束來避免。

func changeModel(_ model: Model, completion: @escaping () -> Void) {
    var modelRef = model
    Api.shared.doRandomAsyncStuff() { (_) in             
        modelRef.name = "changed"
        completion()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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