簡體   English   中英

Swift 5.6協議擴展中關聯類型的static變量如何實現?

[英]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的實現添加到FloatSizedSizeSizedclass實現來解決這種情況。 請注意,這只需要為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM