[英]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.