【问题标题】:Append to generic array in Swift在 Swift 中追加到泛型数组
【发布时间】:2016-03-08 04:19:27
【问题描述】:

我有一个名为Foo 的协议和一个名为Bar 的结构。 Bar 符合 Foo

protocol Foo {}    
struct Bar: Foo {}

Bar 实例附加到Bar 数组可以按预期工作。

var array = [Bar]()
array.append(Bar())

现在,我有一个名为Baz 的通用结构,它使用符合Foo 的类型进行初始化(例如Bar)。

struct Baz<T: Foo> {
    private(set) var array = [T]()

    init() {
        if T.self is Bar.Type {
            // Error: Cannot invoke 'append' with an argument list of type (Bar)
            array.append(Bar())
        }
    }
}

尝试追加到数组会导致以下错误:

无法使用 (Bar) 类型的参数列表调用“附加”

为什么没有按预期工作?

顺便说一句,用例是这样的:

let bazBarStack = Baz<Bar>().array
let bazQuxStack = Baz<Qux>().array

【问题讨论】:

  • 可能类似于array.append(Bar() as T)?
  • 是的,投射到 T 修复了它。不知何故,这个解决方案完全暗示了我哈哈。谢谢!

标签: arrays swift generics


【解决方案1】:

您需要将对象存储在 T 类型的数组中。因此您应该使用as! T 进行转换:

struct Baz<T: Foo> {
    private(set) var array = [T]()

    init() {
        if T.self is Bar.Type {
            array.append(Bar() as! T)
        }
    }
}

【讨论】:

  • 您提供了与@njzk2 相同的解决方案(在 cmets 中)。但是,您确实对示例进行了详细说明,所以我认为可以将其标记为正确...确实需要强制转换,所以感谢您指出这一点。
【解决方案2】:

因为array 包含单一类型T 的元素,它必须符合Foo,但不一定与Bar 兼容。看起来您希望拥有一个可以容纳任何符合 Foo 的数组;在这种情况下,完全摆脱泛型并简单地编写

private(set) var array = [Foo]()

然后你的初始化将是

init() {
    array.append(Bar())
}

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2015-10-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多