【问题标题】:Change value of generic property after initialization初始化后更改通用属性的值
【发布时间】:2020-11-01 10:20:41
【问题描述】:

这是我的包含泛型的结构:

struct SupportOptions<S> where S: ListStyle {
    var text: String = ""
    var listStyle: S
}

/**
 Allow initializing without a `listStyle` https://stackoverflow.com/a/64530006/14351818
 */
extension SupportOptions where S == InsetGroupedListStyle {
    init(text: String = "") {
        self.text = text
        self.listStyle = InsetGroupedListStyle()
    }
}

然后我像这样创建它的一个实例:

class ViewController: UIViewController {
    var options = SupportOptions()
}

但是,当我尝试更改 options.listStyle 时,它不起作用。

options.listStyle = InsetListStyle()

无法将“InsetListStyle”类型的值分配给“InsetGroupedListStyle”类型

【问题讨论】:

  • 不是我的反对意见,但这不是通用的工作方式。一旦你初始化了属性,你就定义了它的类型。 IMO 以后无法更改。您需要创建一个新的 SupportOptions 对象。
  • 我没有投反对票,但你做错了什么。您正在以一种非常奇怪的方式混合 SwiftUI 和 UIKit/错误地使用 SwiftUI... SwiftUI 类型不喜欢这样分配。您可能需要为 ListStyle 创建自己的枚举包装器并使用它,然后在 List 上编写一个扩展方法,该方法采用您的包装器枚举并设置列表样式。
  • @LeoDabus 知道了。
  • @Sweeper 枚举听起来不错。
  • 因未显示用例而被否决,这将导致您不断提出对其他人没有帮助的问题,并且将其命名为 S 而不是 `ListStyle。不能帮助其他人的问题应该交给顾问来回答。

标签: ios swift generics


【解决方案1】:

当您在没有参数的情况下调用 SupportOptions() 时,它实际上是在调用带有可选 text 参数的空字符串的 init(text:)。您的 init(text:) 方法将通用约束 S 定义为 InsetGroupedListStyle 类型。一旦定义了通用约束,就不能将除 InsetGroupedListStyle 实例之外的任何内容分配给 listStyle。这就是您的 InsetListStyle 分配失败的原因。

如果您希望 listStyle 为 InsetListStyle 类型,则需要在实例化时指定:

class ViewController: UIViewController {
    var options = SupportOptions(text: "", listStyle: InsetListStyle())
}

【讨论】:

  • 知道了。我可能会按照@Sweeper 的建议做,使用枚举
  • 嘿,罗伯!最后一次需要你的帮助:D 我在 Linkedin 上给你发了消息
猜你喜欢
  • 2019-06-03
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多