Не удается добавить в расширение 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)