[英]Swift: override associatedtype from protocol extension in protocol conformance
[英]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.