繁体   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