Swift引用字典键和值而不知道键

时间:2014-11-18 08:10:07

标签: dictionary swift

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

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

数组中的Dictionary是一个简单的用户名+ yes / no标志      [[1stUser:Y],[2ndUser:N],[3rdUser:N]]

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

let userRecord = users[indexPath.row] as NSDictionary

并且需要 assign cell.textlabel.text = username(字典的键)

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

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

问题是如何在不事先知道它们的情况下参考字典键(' 1stUser',' 2nduser'等)并检查值(Y / N)?我看到的所有Swift字典示例都假设我们知道检索其值的实际密钥(例如,用户[" 1stUser"]没有帮助,因为我事先并不知道1stUser有Y)。

4 个答案:

答案 0 :(得分:1)

你应该总是知道你的字典键。如果不这样做,那么您构建的数据就是错误的 - 未知数据应始终位于字典的值中,而不是密钥。

请考虑使用带有两个键的字典:“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

答案 1 :(得分:1)

我同意@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]]转换为[(name:String,flag:Bool)]

let users:[[String:String]] = [["1stUser": "Y"], ["2ndUser": "N"], ["3rdUser": "N"]]

let usersModified = users.map { dict -> (name:String, flag:Bool) in
    let (key, val) = dict[dict.startIndex]
    return (
        name: key,
        flag: val == "Y" ? true : false
    )
}

通过这样做你可以简单地:

let user = usersModified[indexPath.row]
cell.textLabel.text = user.name
cell.accessoryType = user.flag ? .Checkmark : .None

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在不事先知道密钥的情况下,除了枚举所有(密钥,值)对(如@valfer说)并测试标志值之外别无他法。字典不支持诸如"之类的查询报告具有True值的所有条目"。

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