我在从字典中选择三个随机元素时遇到问题。
我的词典代码:
query.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let childSnap = child as! DataSnapshot
var dict = childSnap.value as! [String: Any]
}
})
答案 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")
}
}
此代码可确保不会两次选择同一用户。请注意,这对包含用户的数组具有破坏性,因此,如果不需要,请在填充数组后对其进行复制,然后使用该数组。