[英]How to implement static variables of associated types in protocol extensions in Swift 5.6?
以下代码在 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
实现来解决这种情况。 请注意,这只需要为static 变量staticSize
,而协议扩展适用于非静态变量size
。
由于我在实际项目中有很多 Float-Sized 和 Size-Sized 类的不同实现,我想用与当前类似的方法来修复它,而不是为每个不同的类添加相同的默认实现类。
有没有人有任何想法,为什么 Swift 5.6 以新的方式处理事情和/或如何解决这个问题,而不是将相同的默认代码添加到 50+ class 文件?
这应该通过告诉编译器符合类的Size
是多少来解决
class FloatSized: Sized {
typealias Size = CGFloat
//...
}
class SizeSized: Sized {
typealias Size = CGSize
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.