在我的项目中,我有以下扩展和协议一致性:
//Extension
extension RawRepresentable where Self: Codable {
// return value as a string
public var rawValue: String {
if let json = try? JSONEncoder().encode(self),
let string = String(data: json, encoding: .utf8) {
return string
} else {
return "{}"
}
}
// parse value from a string
public init?(rawValue: String) {
if let value = try? JSONDecoder().decode(Self.self, from: Data(rawValue.utf8)) {
self = value
} else {
return nil
}
}
}
个字符
构建应用程序目标(iOS)成功,但构建测试目标(单元测试)失败,错误为Redundant conformance of 'Optional<Wrapped>' to protocol 'RawRepresentable'
当我删除协议一致性时,应用目标由于以下语句的错误而失败:@AppStorage(StorageKeys.bag.rawValue) var bag: Bag? = nil
错误如下:
Candidate requires that the types 'Bag?' and 'Bool' be equivalent (requirement specified as 'Value' == 'Bool')
Candidate requires that the types 'Bag?' and ‘In’t be equivalent (requirement specified as 'Value' == ‘Int’)
Candidate requires that the types 'Bag?' and ‘Double’ be equivalent (requirement specified as 'Value' == ‘Double’)
Candidate requires that the types 'Bag?' and ‘String’ be equivalent (requirement specified as 'Value' == ‘String’)
Candidate requires that the types 'Bag?' and ‘URL’ be equivalent (requirement specified as 'Value' == ‘URL’)
Candidate requires that the types 'Bag?' and ‘Data’ be equivalent (requirement specified as 'Value' == ‘Data’)
型
我已经使用了Xcode的find symbol in workspace
功能,但在其他地方找不到该协议一致性。如何在不更新bag
定义的情况下解决此问题?
1条答案
按热度按时间s4n0splo1#
使您无法控制的类型符合您无法控制的协议往往会导致这类问题,应该极力避免。(可能是苹果提供的东西)也决定做同样的事情,现在你有一个冲突的一致性。一个类型在整个系统中只能符合一个协议一次。如果你既不控制类型也不控制协议,你不能确定会发生这种事
除此之外,你的
extension RawRepresentable where Self: Codable
实现是不正确的。它假设每个可编码的RawRepresentable也有一个String类型的RawValue。这是不正确的。你应该把这两个扩展都去掉。
我相信你想做的是沿着Store custom data type in @AppStorage with optional initializer?的路线。看起来你已经使用了“通用”解决方案。正如我在那里的评论中指出的,这是非常危险的,正是你遇到的原因。请参阅我的答案,以获得解决这个问题的更健壮的方法。