以下代碼在 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的實作來解決這種class情況。請注意,這只需要對靜態變數進行,而協議擴展對非靜態變數有效。FloatSizedSizeSized staticSize size
由于我在真實的現場專案中有很多不同的 Float-Sized 和 Size-Sized 類的實作,我想用與當前方法類似的方法來解決這個問題,而不是為每個不同的方法添加相同的默認實作類。
有沒有人有任何想法,為什么 Swift 5.6 以新的方式處理事情和/或如何解決這個問題,而不是向 50 多個類檔案添加相同的默認代碼?
uj5u.com熱心網友回復:
這應該通過告訴編譯器什么Size是符合標準的類來解決
class FloatSized: Sized {
typealias Size = CGFloat
//...
}
class SizeSized: Sized {
typealias Size = CGSize
//...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/446952.html
上一篇:無法推斷flatMap中的型別
