我已经扩展了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)
但是元素根本没有添加到数组中。
我不了解这种情况?这甚至可能吗?
答案 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)