如何使用Swift将字典添加到数组?

时间:2014-10-15 17:49:08

标签: arrays dictionary swift

我试图将包含人物属性的字典添加到数组中,但它无法正常工作。我收到以下错误:

[(Any)] is not identical to UInt8

这是我的代码:

var people = [Any]()

class Database {
    class func addPerson(dict: [String : Any]) -> Void {
        people += dict
    }
}

Database.addPerson(["name" : "Fred"])

2 个答案:

答案 0 :(得分:3)

+=上的Array运算符对应Array.extend,其中SequenceType而不是单个元素。如果您将dict包裹在Array中,则+=将起作用:

people += [dict]

但是,使用append函数更简单,效率更高:

people.append(dict)

旁注:

我不确定为什么您使用Any作为Array的元素类型和Dictionary的值类型(也许你有充分的理由),但如果可能的话,你通常应该避免这种情况。在这种情况下,我将dict声明为[String: String],将people声明为[[String: String]]

var people = [[String: String]]()

class Database {
    class func addPerson(dict: [String : String]) -> Void {
        people.append(dict)
    }
}

Database.addPerson(["name" : "Fred"])

如果您需要在Dictionary中存储多种类型,可以采用以下几种方式。

  1. 直接使用NSDictionary
  2. Dictionary声明为[String: AnyObject]
  3. 使用enum with associated values作为值类型(如果您只需支持几种类型,这通常是Swift中的最佳选项,因为所有类型都保持强类型)
  4. 使用enum的快速示例(在其他SO问题中有很多这种技术的例子):

    enum DictValue {
        case AsString(String)
        case AsInt(Int)
    }
    
    var people = [[String: DictValue]]()
    
    class Database {
        class func addPerson(dict: [String : DictValue]) -> Void {
            people.append(dict)
        }
    }
    
    Database.addPerson(["name" : DictValue.AsString("Fred")])
    Database.addPerson(["name" : DictValue.AsInt(1)])
    

答案 1 :(得分:1)

我猜没有内置运算符。您可以使用:

people.append(dict)
// or
people += [dict as Any]