无法追加到数组扩展名中

时间:2016-03-10 16:47:45

标签: arrays swift swift-extensions

我已经扩展了Array类以创建一些方法。但是我无法附加到数组:

private extension Array
{
    mutating func addCharacterWithIndex(char: String, index: Int)
    {
        let dict = [
            "char": char,
            "index": index
        ]
        self.append(dict) //Shows error: Cannot invoke 'append' with argument list of type '(NSDictionary)'
    }
}

我能让它消失的唯一方法就是使用

self.append(dict as! Element)

但是元素根本没有添加到数组中。

我不了解这种情况?这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

<强>更新

我刚刚意识到可以在这里使用DictionaryLiteralConvertible。

extension Array where Element: DictionaryLiteralConvertible, Element.Key == String, Element.Value == Int {
    mutating func addCharacterWithIndex(char: String, index: Int)
    {
        self.append(Element.init(dictionaryLiteral: (char, index)))
    }
}

原始答案......

由于Swift中的Array是一个通用结构,因此不可能(至少现在)使用特定类型约束扩展Array。

对于你的问题,一种方法是使其成为可选的。

extension Array
{
    mutating func addCharacterWithIndex(char: String, index: Int)
    {
        if let dict = [
            "char": char,
            "index": index
            ] as? Element {
            self.append(dict)
        }
    }
}

所以你可以像这样使用它:

var symbols: [[String: AnyObject]] = []
symbols.addCharacterWithIndex("*", index: 9)

然而,这并不一致。对于其他数组,例如[Int], [String],此方法可以访问但不执行任何操作。

另一种方式,假设您只使用append方法,则可以扩展RangeReplaceableCollectionType

extension RangeReplaceableCollectionType where Generator.Element == NSDictionary {
    mutating func addCharacterWithIndex(char: String, index: Int)
    {
        let dict = [
            "char": char,
            "index": index
        ]

        self.append(dict)
    }
}

并像这样使用它:

var symbols: [NSDictionary] = []
symbols.addCharacterWithIndex("*", index: 9)