如何在Swift 4.1中从字典中挑选三个随机元素

时间:2018-10-03 20:07:49

标签: swift firebase dictionary

我在从字典中选择三个随机元素时遇到问题。

我的词典代码:

query.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children {
        let childSnap = child as! DataSnapshot
        var dict = childSnap.value as! [String: Any]
    }
})

2 个答案:

答案 0 :(得分:0)

如果键是整数,则可以使用数组。

如果您只想使用字典,那么下面提到的代码可能对您有所帮助

var namesOfPeople = [Int: String]()
namesOfPeople[1] = "jacob"
namesOfPeople[2] = "peter"
namesOfPeople[3] = "sam"

func makeList(n: Int) -> [Int] {
    print(namesOfPeopleCount)
    return (0..<n).map { _ in namesOfPeople.keys.randomElement()! }
}

let randomKeys = makeList(3)

您可以尝试在randomElement()不可用的较早版本的Swift中进行尝试

let namesOfPeopleCount = namesOfPeople.count
func makeList(n: Int) -> [Int] {
  return (0..<n).map{ _ in Int(arc4random_uniform(namesOfPeopleCount)
}

答案 1 :(得分:0)

@Satish答案很好,但这是一个比较完整的答案,它从Firebase加载的用户列表中选择一个随机用户,以确保只选择一次该用户。

我们有一个带有两个按钮的应用程序

populateArray
selectRandomUser

,我们有一个UserClass来存储每个用户的用户数据。

class UserClass {
    var uid = ""
    var name = ""
    init(withSnapshot: DataSnapshot) {
        let dict = withSnapshot.value as! [String: Any]
        self.uid = withSnapshot.key
        self.name = dict["Name"] as! String
    }
}

和一个用于存储用户的数组

var userArray = [UserClass]()

单击populateArray按钮时,此代码将运行

func populateArray() {
    let usersRef = self.ref.child("users")
    usersRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let user = UserClass(withSnapshot: snap)
            self.userArray.append(user)
        }
        print("array populated")
    })
}

然后使用此代码选择随机用户。

func selectRandomUser() {
    if let someUser = userArray.randomElement() {
        print("your random user: \(someUser.name)")
        let uid = someUser.uid
        if let index = userArray.index(where: { $0.uid == uid } ) {
            userArray.remove(at: index)
        }
    } else {
        print("no users remain")
    }
}

此代码可确保不会两次选择同一用户。请注意,这对包含用户的数组具有破坏性,因此,如果不需要,请在填充数组后对其进行复制,然后使用该数组。