我有 2 个符合一个协议的结构。我创建了带有关联类型的枚举作为结构类型。当我尝试使用动态成员查找访问协议类型 A 的属性时,getter 工作正常。但是 Set 方法抛出错误:根类型为“A”的密钥路径不能应用于类型为“A1”/“A2”的基础
有时我也会收到此错误:无法通过下标分配:'a' is immutable
import Foundation
protocol A {
var id: String { get }
}
struct A1 : A {
var id: String
var type: String
}
struct A2 : A {
var id: String
var test: String
}
@dynamicMemberLookup
enum AType {
case a1(A1)
case a2(A2)
}
extension AType {
subscript<T>(dynamicMember keyPath: WritableKeyPath<A, T>) -> T {
get {
switch self{
case .a1(let a):
return a[keyPath: keyPath]
case .a2(let a):
return a[keyPath: keyPath]
}
}
set {
switch self{
case .a1(var a):
a[keyPath: keyPath] = newValue
case .a2(var a):
a[keyPath: keyPath] = newValue
}
}
}
}
let a1struct = A1(id: "123", type: "Test")
var atype = AType.a1(a1struct)
print(atype.id)
任何想法都会有所帮助