以下代码在Xcode 13.1 / Swift 5.5中编译,但在Xcode 13.3 / Swift 5.6中不编译
protocol Sized {
associatedtype Size
static var staticSize: Size? { get }
var size: Size? { get }
static var staticSizeString: String? { get }
}
extension Sized where Self: FloatSized {
static var staticSize: CGFloat? {
return 7
}
var size: CGFloat? {
return 77
}
static var staticSizeString: String? {
return "seven"
}
}
extension Sized where Self: SizeSized {
static var staticSize: CGSize? {
return .init(width: 7, height: 11)
}
var size: CGSize? {
return .init(width: 77, height: 1111)
}
static var staticSizeString: String? {
return "seven eleven"
}
}
class FloatSized: Sized {
}
class SizeSized: Sized {
}5.6编译器告诉我们
error: type 'FloatSized' does not conform to protocol 'Sized' (SizeSized相同)
和
note: ambiguous inference of associated type 'Size': 'CGFloat' vs. 'CGSize'
associatedtype Size。
`^` 可以通过将staticSize的实现添加到FloatSized和SizeSized的class实现中来解决这种情况。注意,这只需要为静态变量 staticSize完成,而协议扩展对于非静态变量 size很好地工作。
由于我的实际项目中有很多不同的浮点大小类和大小类的实现,所以我想用类似于当前的方法来修复这个问题,而不是在每个不同的类中添加相同的默认实现。
除了将相同的默认代码添加到50+类文件之外,还有人有什么想法吗?为什么SWIFT5.6会以新的方式和/或如何解决这个问题?
发布于 2022-03-21 22:11:10
应该通过告诉编译器协调类的Size是什么来解决这个问题。
class FloatSized: Sized {
typealias Size = CGFloat
//...
}
class SizeSized: Sized {
typealias Size = CGSize
//...
}https://stackoverflow.com/questions/71563154
复制相似问题