首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Swift 5.6协议扩展中实现关联类型的静态变量?

如何在Swift 5.6协议扩展中实现关联类型的静态变量?
EN

Stack Overflow用户
提问于 2022-03-21 19:34:42
回答 1查看 174关注 0票数 1

以下代码在Xcode 13.1 / Swift 5.5中编译,但在Xcode 13.3 / Swift 5.6中不编译

代码语言:javascript
复制
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

代码语言:javascript
复制
          `^`  

可以通过将staticSize的实现添加到FloatSizedSizeSizedclass实现中来解决这种情况。注意,这只需要为静态变量 staticSize完成,而协议扩展对于非静态变量 size很好地工作。

由于我的实际项目中有很多不同的浮点大小类和大小类的实现,所以我想用类似于当前的方法来修复这个问题,而不是在每个不同的类中添加相同的默认实现。

除了将相同的默认代码添加到50+类文件之外,还有人有什么想法吗?为什么SWIFT5.6会以新的方式和/或如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-21 22:11:10

应该通过告诉编译器协调类的Size是什么来解决这个问题。

代码语言:javascript
复制
class FloatSized: Sized {
    typealias Size = CGFloat
    //...
}

class SizeSized: Sized {
    typealias Size = CGSize
    //...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71563154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档