Dictionary 在不知道键的情况下快速引用字典键和值

Dictionary 在不知道键的情况下快速引用字典键和值,dictionary,swift,Dictionary,Swift,我有一个字典数组,定义为 var users = [[String:String]]() 数组中的字典是一个简单的用户名+是/否标志 [[1用户:Y],[2用户:N],[3用户:N]] 在TableView单元格配置中,我定义了 let userRecord = users[indexPath.row] as NSDictionary 而且需要 分配cell.textlab.text=用户名(字典的键) 检查标志(是/否),如果是>cell.accessoryType=UITableVie

我有一个字典数组,定义为

var users = [[String:String]]() 
数组中的字典是一个简单的用户名+是/否标志 [[1用户:Y],[2用户:N],[3用户:N]]

在TableView单元格配置中,我定义了

let userRecord = users[indexPath.row] as NSDictionary
而且需要 分配cell.textlab.text=用户名(字典的键)

检查标志(是/否),如果是>cell.accessoryType=UITableViewCellAccessoryType.Checkmark

在上面的示例中,我应该只在1stUser旁边打一个复选标记


问题是如何引用字典键(“1stUser”、“2nduser”等),而不事先知道它们并检查值(Y/N)?我看到的所有Swift字典示例都假设我们知道检索其值的实际键(例如,用户[“1stUser”]没有帮助,因为我事先不知道1stUser有一个Y)。

您可以使用以下方法在字典上迭代:

for (key, value) in myDictionary {
   // here use key and value
}

你应该总是知道你的字典钥匙。如果不这样做,那么您的数据结构就是错误的——未知数据应该始终在字典的值中,而不是键中

考虑使用一个带有两个键的字典:“username”和“flag”


示例代码:

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

users.append(["username" : "Aaron", "flag" : "yes"])
users.append(["username" : "AspiringDeveloper", "flag" : "yes"])

let userRecord = users[1]

let username = userRecord["username"]!
let flag = userRecord["flag"]!
或者,您可以构建一个基本类并完全避免使用字典:

class User {
    let username: String
    let flag: Bool

    init(username:String, flag:Bool) {
        self.username = username
        self.flag = flag
    }
}

var users = [User]()

users.append(User(username: "Aaron", flag: true))
users.append(User(username: "AspiringDeveloper", flag: true))

let userRecord = users[1]

let username = userRecord.username
let flag = userRecord.flag

我同意@AaronBrager的回答,但是

如果您确定字典至少有一个值,且不超过一个值,则可以

let dict = ["user1":"yes"]

// retrieve the key and the value
let (key, val) = dict[dict.startIndex] // -> key == "user1", val == "yes"

// retrieve the key
let key = dict.keys.first! // -> key == "user1"
因此,让我们将
[[String:String]]
转换为
[(名称:String,标志:Bool)]

通过这样做,您可以简单地:

let user = usersModified[indexPath.row]
cell.textLabel.text = user.name
cell.accessoryType = user.flag ? .Checkmark : .None
在事先不知道密钥的情况下,除了枚举所有(键、值)对(如@valfer所说)并测试标志值之外,没有其他方法。字典不支持诸如“报告所有具有真实值的条目”之类的查询


您的问题陈述不清楚是否始终只有一个真正的标志。如果是,您可以在找到扫描后立即停止扫描。

这将得到答案,但这是一种存储此数据的糟糕方法。是的,我同意您关于存储数据的看法。无论如何,有时列举字典中的所有键(并知道如何做)是有用的。谢谢Valfer。我确实研究了苹果的Swift语言参考中的for(key,value),但它并没有完全解决我的问题(我想显示一个表格,根据字典条目,一个带有用户名的单元格可以有一个复选标记,也可以没有)。如前所述,Aaron建议使用2个键/记录解决了问题。我的tableView现在在带有Y的用户旁边显示了正确的复选标记。我不能同意这一点。在很多情况下,字典用于数据验证,例如检查用户输入。在字典中查找未知键是完全习惯的做法。为什么需要具有未知键的字典来检查用户输入?OP非常清楚地在key.No中存储了一个值。OP有一个简单的关系,由一个字典实现,其中用户名作为键(实际上是关系的主键),布尔属性Y/N作为值。对于一张小桌子来说,这是一个非常合理的构造。OP只是想知道如何枚举表中的条目并检查它们的Y/N值。顺便说一句,没有什么能比得上一本有两个键的字典了。艾伦:它奏效了!你的建议是一本有两个键的字典。将用户名和标志添加到字典时:self.dict.append([“username”:username,“flag”:flag])显示tableView单元格时:if self.dict.count>indexath.row{let userRecord=self.dict[indexath.row]cell.textlab.text=userRecord[“username”]!if userRecord[“flag”!=“Y”{cell.accessoryType=UITableViewCellAccessoryType.Checkmark}}否则{cell.textLabel.text=“Loading..”}谢谢!@TylerA.你为什么认为它叫“键”?(我不是讽刺的意思。)谢谢Yves。我从StackOverflow的第一篇文章中学到了很多,应该对问题陈述进行扩展,指出字典可以包含多个具有不同Y/N的用户,或者根本没有用户(因为它是根据其他条件在程序中构建的)。再次感谢您的输入。感谢rintaro。该词典确实有多个具有不同Y/N的用户。如前所述,Aaron建议使用具有2个键/REC的词典确实解决了此问题。我的tableview现在显示所有用户,在带有Y标志的用户旁边有正确的复选标记。感谢您的输入。
let user = usersModified[indexPath.row]
cell.textLabel.text = user.name
cell.accessoryType = user.flag ? .Checkmark : .None