【发布时间】:2017-05-28 18:17:57
【问题描述】:
问题:给定函数的输入,测试每个用户以确保他们符合以下条件:
1. users 数组中的每个用户都不能与当前用户共享聊天室。 (Chatroom 对象有两个属性“firstUserId”和“secondUserId”。
2. users 数组中的每个用户都不是当前用户。
3. users 数组中的每个用户都在当前用户半径 5 英里范围内。
在完成处理程序的调用中,我检查用户对象的值是否为真,如果是,我将其作为潜在匹配显示给当前用户。
现在,我很快就暴力破解了这个解决方案,但每次看到它都会畏缩。它似乎非常低效。非常感谢任何有关更优雅解决方案的提示!
typealias validUsersCompletionHandler = (_ users: [User: Bool]) -> Void
private func validateNewUsers(currentUser: User, users: [User], chatrooms: [Chatroom], completionHandler: validUsersCompletionHandler?) {
var results: [User: Bool] = [:]
let currentUserCoords = CLLocation(latitude: currentUser.latitude, longitude: currentUser.longitude)
for user in users {
let newUserCoords = CLLocation(latitude: user.latitude, longitude: user.longitude)
let distance = currentUserCoords.distance(from: newUserCoords)
// // 1 mile = 1609 meters, 8046.72 = 5 miles.
for chatroom in chatrooms {
if currentUser.id == chatroom.firstUserId && user.id == chatroom.secondUserId {
results[user] = false
} else if currentUser.id == chatroom.secondUserId && user.id == chatroom.firstUserId {
results[user] = false
} else if user.id == currentUser.id {
results[user] = false
} else if distance > 8046.72 {
results[user] = false
} else {
results[user] = true
}
}
}
completionHandler?(results)
}
// *************************************************** ******************************
// 下面是我修改后的方法。我想稍微优雅一点?
// *************************************************** ******************************
typealias validUsersCompletionHandler = (_ users: [User: Bool]) -> Void
private func validateNewUsers(currentUser: User, users: [User], chatrooms: [Chatroom], completionHandler: validUsersCompletionHandler?) {
var results: [User: Bool] = [:]
var isInRange = false
var distance: Double = 0 {
didSet {
if distance > 8046.72 {
isInRange = false
} else {
isInRange = true
}
}
}
let currentUserCoords = CLLocation(latitude: currentUser.latitude, longitude: currentUser.longitude)
let currentUserId = currentUser.id
for user in users {
let userId = user.id
let newUserCoords = CLLocation(latitude: user.latitude, longitude: user.longitude)
distance = currentUserCoords.distance(from: newUserCoords)
// // 1 mile = 1609 meters, 8046.72 = 5 miles.
for chatroom in chatrooms {
switch (currentUserId, userId, isInRange) {
case (chatroom.firstUserId,chatroom.secondUserId, _), (_, _, false),(chatroom.secondUserId, chatroom.firstUserId, _), (_, currentUserId, _): results[user] = false
default: results[user] = true
}
}
}
completionHandler?(results)
}
}
【问题讨论】:
标签: swift if-statement nested-loops