如何在Swift中追加关联数组元素

3
我该如何在Swift中创建和添加到关联数组?我认为应该像以下这样(请注意,某些值是字符串,而其他值是数字):
var myArray = []

var make = "chevy"
var year = 2008
var color = "red"

myArray.append("trackMake":make,"trackYear":year,"trackColor":color)

目标是能够拥有一个结果数组,使我可以进行如下调用:

println(myArray[0]["trackMake"]) //and get chevy
println(myArray[0]["trackColor"]) //and get red

你想要类似于字典(键:值)在数组中的结果吗? - user3182143
完成后,我试图获得以下结果: myArray [0] ["trackMake"] //获取雪佛兰 这意味着零可以替换为任何有效的整数来引用数组元素。 - Jack Amoratis
4个回答

7
就像这样简单:
myArray.append(["trackMake":make,"trackYear":year,"trackColor":color])

添加括号。这将使它成为哈希并将其附加到数组中。

在这种情况下,要广泛使用 let

let dict  = ["trackMake":make,"trackYear":year,"trackColor":color]
myArray.append(dict)

上述假设您的myArray已经被声明为:
var myArray = [[String:AnyObject]]()

因此编译器知道它将获取字典元素。


但是当我尝试你说的时候,我收到了一个错误:NSArray没有名为append的成员。我像这样设置数组:var myArray = []。 - Jack Amoratis
1
@JackAmoratis 请展示你数组的声明。 - qwerty_so
你需要将其声明为 var myArray = [[String:AnyObject]]() - qwerty_so
谢谢Thomas,那个声明也会适用于数字项目,比如年份吗? - Jack Amoratis
是的,您可以将 IntString 放入其中,因为它们符合 AnyObject 协议。 - qwerty_so
显示剩余4条评论

3

我接受上面的答案,它非常好。虽然你已经给出正确的答案,但我喜欢用最简单的方法来解释。如果你们按照以下步骤操作,会很有用。如果有人刚开始学习Swift,并且阅读这篇内容,他们也可以轻松理解这些步骤。

步骤1:声明并初始化变量

  var array = Array<AnyObject>()
  var dict = Dictionary<String, AnyObject>()
  var make = "chevy"
  var year = 2008
  var color = "red"

步骤2:设置字典(添加键和值)
  dict["trackMake"] = make
  dict["trackYear"] = year
  dict["trackColor"] = color
  println("the dict is-\(dict)")

第三步:将字典添加到数组中。
  array.append(dict)
  println("the array is-\(array)")

步骤 4:将数组值存储到变量中(创建用于获取值的变量)

  let getMakeValue =  array[0]["trackMake"]
  let getYearValue = array[0]["trackYear"]
  let getColorValue = array[0]["trackColor"]

  println("the getMakeValue is - \(getMakeValue)")
  println("the getYearValue is - \(getYearValue)")
  println("the getColorVlaue is - \(getColorValue)")   

步骤5:如果您想将值转换为字符串,请执行以下步骤

 var stringMakeValue:String = getMakeValue as String
 var stringYearValue:String = ("\(getYearValue as Int)")
 var stringColorValue:String = getColorValue as String

 println("the stringMakeValue is - \(stringMakeValue)")
 println("the stringYearValue is - \(stringYearValue)")
 println("the stringColorValue is - \(stringColorValue)")

步骤6:最终的总输出值为:
the dict is-[trackMake: chevy, trackColor: red, trackYear: 2008]

the array is-[{
trackColor = red;
trackMake = chevy;
trackYear = 2008;
}]

the getMakeValue is - Optional(chevy)
the getYearValue is - Optional(2008)
the getColorVlaue is - Optional(red)

the stringMakeValue is - chevy
the stringYearValue is - 2008
the stringColorValue is - red

Thank You


1
这似乎是您想要表示车辆的对象数组。您可以使用字典数组或车辆对象数组。可能您会选择使用对象,因为Swift数组和字典必须具有类型。因此,您的带有字符串键和不同类型值的字典最终将具有类型[String : Any],并且您将被困在来回转换中。这将使您的数组类型为[[String : Any ]]
使用对象,您只需要一个该类型的数组。假设您的车辆对象类型名为Vehicle,那么您的数组类型就是[Vehicle],每个数组访问都将返回该类型的实例。

0

如果我想使用自己的语句尝试它。同时,我还想用字典中的数据扩展我的数组,并仅打印出字典中的键:

var myArray = ["Abdurrahman","Yomna"]

var myDic: [String: Any] = [
    "ahmed": 23,
    "amal": 33,
    "fahdad": 88]

for index in 1...3 {

    let dict: [String: Any] = [
        "key": "new value"
    ]

    // get existing items, or create new array if doesn't exist
    var existingItems = myDic[myArray] as? [[String: Any]] ?? [[String: Any]]()

    // append the item
    existingItems.append(myArray)

    // replace back into `data`
    myDic[myArray] = existingItems
}

您是不是想将此作为一个新问题提交? - C. Helling
不,我的意思是我尝试解决相同的问题,但它显示错误。 - Sarah
如果你遇到了问题,应该提出一个新的问题,并附上更多关于你遇到的错误的细节,而不是将其作为对现有问题的回答提交。 - C. Helling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接