Я не могу понять, как отличать массив от целого массива, и я хочу притвориться, что мы не знаем, что userInData [0,1,2,3] совпадает с провереннымUsers [0,1,2, 3], я хочу как-то сопоставить одно и то же значение без использования индекса каждого массива.
Я попробовал this-
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")
}
но он печатает "обычного пользователя", поэтому в основном это не сработало. Я хочу, чтобы проверенные пользователи отличались от обычных пользователей. Так, например, пользователь "привет" получает специальный подтвержденный значок и т.д. Спасибо!
Что-то вроде этого, что вы после?
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")
}
}
Я не совсем уверен, что вы ищете здесь.
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
}
}
Я уверен, что есть лучший ответ на проблему подпоследовательности.
ОБНОВИТЬ
Вдохновленный API @iLandes, я добавил завернутый мой тест подпоследовательности.
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")
}
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")
}
}
попробуй это. он будет работать
Я понимаю, что вы хотите знать, какое значение присутствует в обоих массивах.
Мы можем использовать Sets
для их поиска, как известно из теории множеств в математике.
То, что вы ищете, называется 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
, который сохраняет порядок, но не работает для быстрых типов,Вы должны использовать contains: func содержит (_ element: String) → Bool. К сожалению, реализация по умолчанию этой функции сравнивает только один элемент.
Вы должны расширить Array и создать func containsArray (array: [Element]) → Bool.
Позвольте сделать это:
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")
}