首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不透明类型的swift/迅捷遗传

不透明类型的swift/迅捷遗传
EN

Stack Overflow用户
提问于 2022-02-27 21:42:14
回答 1查看 72关注 0票数 0

数组中有很多不同类型的元素,我想让它们都知道如何呈现自己.这是相当复杂的,我总是增加新的类型-不想每次都要做猎枪手术

但似乎无法计算出具有不透明类型返回的函数的继承语法--如果我这样做的话:

代码语言:javascript
复制
class Element
{
   func forDisplay() -> some View 
   { fatalError("this function needs to be overridden")}
}

然后尝试覆盖它

代码语言:javascript
复制
class TextElement : Element
{
    ...

    override func forDisplay() -> some View
    { return Text( self.textValue ) };
}

它给了我一个编译错误-如果我忽略了这个单词重写

代码语言:javascript
复制
class TextElement : Element
{
    ...

    func forDisplay() -> some View
    { return Text( self.textValue ) };
}

它编译良好,运行良好,但随后调用基础错误函数。

EN

回答 1

Stack Overflow用户

发布于 2022-02-28 06:33:20

不能覆盖不透明类型。最好不要把任何东西子类化,真的。这是最后的手段。我敢打赌,您甚至不想要一个引用类型,而且您只选择了一个类,因为继承,认为它可以很好地建模您的解决方案。不管…

也许您需要一个具有关联类型的协议,如建议的那样,或者您只是想要一个通用的Element<View: SwiftUI.View>。这些问题是,您将无法限制扩展,因为您将不知道什么是不透明的Views。所以我想你会在幻影类型上有更多的运气。

代码语言:javascript
复制
protocol HeadingTag { }
enum H1: HeadingTag { }
enum H2: HeadingTag { }
enum H3: HeadingTag { }
代码语言:javascript
复制
class Element<Tag> {
代码语言:javascript
复制
extension Element where Tag: HeadingTag  {
  func forDisplay() -> some View {
    Text(textValue)
  }
}
代码语言:javascript
复制
extension Element where Tag == H2 {
  func forDisplay() -> some View {
    // An H2-specific view
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71288674

复制
相关文章

相似问题

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