我无法弄清楚如何让一个数组与整个数组相匹配,我想假装我们不知道usersInData [0,1,2,3]是一样的VerifiedUsers [0,1,2,3],我想以某种方式匹配相同的值,而不使用每个数组的索引。
我试过了 -
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]
if usersInData == verifiedUsers {
print("special user")
} else {
print("regular user")
}
但它会打印常规用户"所以基本上它没有用。 我希望经过验证的用户与普通用户不同。所以例如用户"你好"获得一个特殊的验证图标等等。谢谢!
答案 0 :(得分:2)
这就是你想要的东西吗?
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]
for user in usersInData {
if verifiedUsers.contains(where: { $0 == user } )
print("\(user) is a special user")
} else {
print("\(user) is a regular user")
}
}
答案 1 :(得分:1)
我不太确定你在这里寻找什么。
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]
如果您想知道verifiedUsers
和usersInData
是否有任何共同点。
if !Set(verifiedUsers).isDisjoint(with: usersInData) {
print("special user")
} else {
print("regular user")
}
如果您想知道verifiedUsers
中的每个元素是否都在usersInData
if Set(verifiedUsers).isSubset(of: usersInData) {
print("special user")
} else {
print("regular user")
}
或
if Set(usersInData).isSuperset(of: verifiedUsers) {
print("special user")
} else {
print("regular user")
}
如果您想知道usersInData
是否包含子序列verifiedUsers
,那么这有点诡计。
for i in usersInData.startIndex ..< usersInData.endIndex - verifiedUsers.count {
if verifiedUsers.elementsEqual(usersInData[i ..< i + verifiedUsers.count]) {
print("special user")
break
}
}
我确信对后续问题有更好的答案。
<强>更新强>
受到@iLandes API的启发,我添加了我的后续测试。
extension Array where Element: Equatable {
func hasSubsequence(_ other: Array) -> Bool {
for i in startIndex ..< endIndex - other.count {
if other.elementsEqual(self[i ..< i + other.count]) {
return true
}
}
return false
}
}
if usersInData.hasSubsequence(verifiedUsers) {
print("special user")
} else {
print("regular user")
}
答案 2 :(得分:0)
你必须使用contains:func contains(_ element:String) - &gt;布尔。不幸的是,这个函数的默认实现只比较了一个元素。
你必须扩展Array并创建func containsArray(array:[Element]) - &gt;布尔。
我们这样做:
extension Array where Element: Equatable {
func containsArray(array: [Element]) -> Bool {
return !array.contains { !self.contains($0) }
}
}
如何在代码中使用它:
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]
if usersInData.containsArray(array: verifiedUsers) {
print("Special user")
} else {
print("Regular user")
}
答案 3 :(得分:0)
我知道您想知道两个数组中存在哪个值。
我们可以使用Sets
来查找它们,如数学中Set Theory所知。
您正在寻找的是 Intersection - 在两个元素集中都可以找到一个元素。数学符号:A ∩ B
。
let usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
let verifiedUsers = ["hello", "hello1", "hello2", "hello3", "hello1212"]
let verifiedUsersInData = Array(Set(usersInData).intersection(verifiedUsers))
print(verifiedUsersInData)
输出:
["hello3", "hello", "hello2", "hello1"]
你可以看到结果数组的顺序不是两个输入数组。这是因为套装没有订购概念。
如果维护订单对您很重要,您有几种选择:
NSOrderedSet
,它保留订单但不适用于swift类型,答案 4 :(得分:0)
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]
for user in usersInData {
if verifiedUsers.contains(user){
print("\(user) is a special user")
} else {
print("\(user) is a regular user")
}
}
试试这个。它会工作