我不是
Swift的专家,我已经使用它几个月来构建Mac应用程序.我想在内存中表示一个类似于
PHP关联数组的数据结构,但在Swift中.让我们假设我有一个数据表要在内存中加载以下字段/记录:
ID Surname Name 1 XXX YYY 2 ZZZ WWW 3 JJJ KKK
我想要获得的是一个关联数组,就像我在PHP中可以获得的那样:
$arr[1]["Surname"] = "XXX" $arr[1]["Name"] = "YYY" $arr[2]["Surname"] = "ZZZ" $arr[2]["Name"] = "WWW"
我只是在Swift中找不到合适的数据结构来获得相同的结果.我尝试使用以下代码:
class resObject: NSObject { private var cvs = [Int: [String: String]]() override init() { self.cvs[0] = ["Name" : "XXX"] self.cvs[0] = ["Surname" : "YYY"] self.cvs[1] = ["Name" : "ZZZ"] self.cvs[1] = ["Surname" : "WWW"] for (key,arr) in cvs { let sur = arr["Surname"] let nam = arr["Name"] println("Row \(key) - Surname: \(sur),Name: \(nam)") } super.init() } }
它看起来非常接近,但它不起作用.我在输出中得到的是以下内容(我不关心“Optional(s)”:
Row 0 - Surname: Optional("XXX"),Name: nil Row 1 - Surname: Optional("ZZZ"),Name: nil
我尝试在调试中进行一些测试,我注意到保存在内存中的数据只是最后一个键:使用的值对(即如果我首先指定Surname而Name指定第二个,我将Surname指定为nil,将Name指定为正确的值).
请注意,在示例中,我在声明变量时不知道数据结构,因此我将其声明为空并稍后以编程方式填充它.
我不知道是不是我没有正确地声明数据结构,或者它是不是允许这样做的Swift.任何帮助将不胜感激.
非常感谢.
问候,
阿莱西奥
解决方法
一种方法是结构词典.考虑:
struct Person { var firstName: String var lastName: String } var peopleByID = [ Int: Person ]() peopleByID[1] = Person(firstName: "First",lastName: "Last") peopleByID[27] = Person(firstName: "Another",lastName: "LastName") var myID = 1 // Try changing this to 2 later if let p = peopleByID[myID] { println("Found: \(p.firstName) with ID: \(myID)") } else { println("No one found with ID: \(myID)") }
然后,您可以更新结构:
peopleByID[1].firstName = "XXX" peopleByID[27].lastName = "ZZZ"
你可以自由迭代:
for p in peopleByID.keys { println("Key: \(p) value: \(peopleByID[p]!.firstName)") }
请注意,仅仅[Person]数组不是那么热,因为ID:
– 可能不是Ints,但通常是字符串
– 即使它们仍然是Ints,数组占用与最高编号索引成比例的存储,而Dictionary只占存储与存储对象数量成比例.想象一下只存储两个ID:523123和2467411.
编辑
看起来您不会提前知道每个Person对象的属性.这很奇怪,但你应该这样做:
struct Person { var attributes = [String : String]() // A dictionary of String keys and String values } var peopleByID = [ Int : Person ]() // and then: var p1 = Person() var p2 = Person() p1.attributes["Surname"] = "Somename" p1.attributes["Name"] = "Firstname" p2.attributes["Address"] = "123 Main St." peopleByID[1] = p1 peopleByID[2] = p2 if let person1 = peopleByID[1] { println(person1.attributes["Surname"]!) for attrKey in person1.attributes.keys { println("Key: \(attrKey) value: \(person1.attributes[attrKey]!)") } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。