Не удается добавить в расширение Array

Я расширил класс 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 ответ

обновленный

Я только что понял, что 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)))
    }
}

Оригинальный ответ...


поскольку Array в Swift это универсальная структура, невозможно (по крайней мере, прямо сейчас) расширить массив с определенным типовым ограничением.

Для вашего вопроса, один из способов сделать это сделать необязательным.

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)
Другие вопросы по тегам