【问题标题】:Is it possible to create an array of struct instances?是否可以创建结构实例数组?
【发布时间】:2016-03-28 17:36:15
【问题描述】:

我正在尝试创建一个这样的结构实例数组:

let installers: [AnyObject] = [Homebrew(), Ls()]

但我收到此错误:

value of type 'Homebrew' does not conform to expected element type 'AnyObject'

当我没有给数组指定类型时,我得到一个模棱两可的类型错误,并且它需要更多上下文。

有可能完成我想做的事情吗?

我用谷歌搜索了所有东西,但我找不到任何东西。

【问题讨论】:

  • 请注意,虽然 Adam 在语法上是正确的,但这几乎总是错误的设计。应该有一些 Homebrew 和 Ls 都符合的协议,并且您应该制作该协议的数组,而不是 AnyAny 破坏了 Swift 的类型安全,并创建了许多棘手的极端情况和微妙的错误(尤其是在涉及泛型或 Optionals 时)。除非绝对必要,否则应避免。 (AnyObject 也是如此。)
  • @RobNapier 同意。

标签: arrays swift struct swift2


【解决方案1】:

对于结构使用Any 而不是AnyObject

let installers: [Any] = [Homebrew(), Ls()]

【讨论】:

    【解决方案2】:

    正如 Rob 上面提出的,我创建了一个简单的协议类型 InstallerType 来帮助您解决这个问题。与其让它符合 Any 或 AnyObject 协议,不如让它符合某种特定类型可以更好地对您的对象进行分类。

    extension Homebrew: InstallerType { }
    extension Ls: InstallerType { }
    
    let installers: [InstallerType] = [Homebrew(), Ls()]
    

    【讨论】:

      【解决方案3】:

      根据@RobNapier 从他的评论中的建议,我建立了一个protocol。因为structs 都使用idcommand 常量,所以我想出了这个:

      protocol CKInstall {
        var id: String {get}
        var command: [String] {get}
      }
      

      问题解决了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 2016-11-02
        • 1970-01-01
        • 2019-02-18
        • 2021-04-25
        • 1970-01-01
        相关资源
        最近更新 更多