gpt4 book ai didi

扩展中的 Swift 协议(protocol)类/AnyObject 限制

转载 作者:行者123 更新时间:2023-12-03 23:44:44 26 4
gpt4 key购买 nike

我有 2 个协议(protocol),一个给对象一个 serverId另一个给他一个status (又名它是否在服务器上发布)。
它们两个允许我处理我的服务器模型和 Core Data 之间的同步。

/// By conforming to this protocol, classes AND struct have an identifiable serverid `Int64`
protocol RemoteObject {
var serverId: ServerId { get set }
}

/// This can only be applied to class
protocol Syncable: class {
var syncStatus: SyncStatus { get set }

}

enum SyncStatus: Int64 {
case published
case local
}
其背后的想法是 RemoteObject可以应用于结构(即 JSON 结构 我从服务器返回)和类( NSManagedObject )。另一方面, Syncable只能应用于类( NSManagedObject )。
对我来说下一步是,当 syncStatus设置为 .local我还需要摆脱 serverId通过将我的对象上的 RemoteObject 设置为-1,但是当我尝试时出现此错误:
extension Syncable where Self: RemoteObject {
var syncStatus: SyncStatus {
get {
SyncStatus(rawValue: syncStatusValue) ?? .local
}
set {
syncStatusValue = newValue.rawValue
if newValue == .local { serverId = -1 } // 🛑 Cannot assign to property: 'self' is immutable
}
}
}

🛑 Cannot assign to property: 'self' is immutable


我知道我收到此错误是因为 RemoteObject可以应用于不可变的结构。
然而 ,考虑到 Syncable只能应用于类类型,不强制 RemoteObject应用到一个类?然后是可变的?
有没有办法强制 RemoteObject成为 类(class)类型在我的扩展中?例如 extension Syncable where Self: RemoteObject & class ?

最佳答案

我最终找到了解决方案。据此post我可以做这个 :

extension Syncable where Self: RemoteObject {
var syncStatus: SyncStatus {
get {
SyncStatus(rawValue: syncStatusValue) ?? .local
}
set {
syncStatusValue = newValue.rawValue
if newValue == .local {
var s = self
s.serverId = -1
}
}
}
}
这消除了错误,据我所知,这将改变 serverId对于引用类型的类,而不是改变作为值类型的结构(无论如何它们不能符合这个协议(protocol))。

更进一步,谁可能会觉得这篇文章有用。我对这个问题的理解并不准确。起初我以为问题出在 RemoteObject协议(protocol),可以应用于任何类型。
根据这个 discussion,问题似乎是另一种方式。 .限制协议(protocol)时 :class:AnyObject , 它使它成为 setter成为 不可变 .
然后,当我尝试更改 serverId 的值时, 我调用 可变 来自 的二传手不可变 导致编译器提示的一种。解决方法对我的使用来说很好,但是为了获得正确的解决方案,我应该摆脱 :classSyncable ,并处理所有迫使我首先使它成为类的原因。

关于扩展中的 Swift 协议(protocol)类/AnyObject 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63539423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com