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



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

我的字典代码:

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

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

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

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)

您可以在旧版本的 Swift 上尝试此操作,因为randomElement()不可用

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

@Satish答案很好,但这里有一个更完整的答案,可以从从Firebase加载的用户列表中选择一个随机用户,确保用户只被选择一次。

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

populateArray
selectRandomUser

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

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]()

单击填充数组按钮时,此代码将运行

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")
}
}

此代码可确保不会两次选择同一用户。请注意,这对包含用户的数组是破坏性的,因此,如果不需要,请在填充数组后创建数组的副本并使用它。

最新更新