#ios #arrays #swift #dictionary #filter
#iOS #массивы #swift #словарь #Фильтр
Вопрос:
У меня есть класс свойств с именем «EpisodeInfoData»
class EpisodeInfoData {
var episodeId = ""
var episodeName = ""
}
Я храню объекты этого класса в словаре, первым элементом которого является «Строка», а другим элементом является массив объектов класса «EpisodeInfoData»
var episodes = Dictionary<String, [EpisodeInfoData]>()
let infoObj1 = EpisodeInfoData()
infoObj1.episodeId = "1"
infoObj1.episodeName = "one"
let infoObj2 = EpisodeInfoData()
infoObj2.episodeId = "2"
infoObj2.episodeName = "two"
let infoObj3 = EpisodeInfoData()
infoObj3.episodeId = "3"
infoObj3.episodeName = "three"
let infoObj4 = EpisodeInfoData()
infoObj4.episodeId = "4"
infoObj4.episodeName = "four"
let infoObj5 = EpisodeInfoData()
infoObj5.episodeId = "5"
infoObj5.episodeName = "five"
let infoObj6 = EpisodeInfoData()
infoObj6.episodeId = "6"
infoObj6.episodeName = "six"
let infoObj7 = EpisodeInfoData()
infoObj7.episodeId = "7"
infoObj7.episodeName = "seven"
let infoObj8 = EpisodeInfoData()
infoObj8.episodeId = "8"
infoObj8.episodeName = "eight"
episodes["season1"] = [infoObj1,infoObj2,infoObj3,infoObj4]
episodes["season2"] = [infoObj5,infoObj6,infoObj7,infoObj8]
Я хочу получить название сезона в словаре «эпизоды», чье имя эпизода равно «восемь». Я попытался применить к нему фильтр, но он не работал.
Может ли кто-нибудь предложить мне что-нибудь, чтобы найти результат с помощью фильтров без использования фильтров.
Заранее благодарю вас
Комментарии:
1. если у меня есть название «сезона», то он работает «пусть temp = эпизоды [«season1»]!.filter { $ 0.episodeId == «8» }» но если у меня есть только идентификатор эпизода, тогда я попробовал это «пусть temp = эпизоды. filter { $ 0.1.filter { $ 0.episodeId == «8»} }»
2. Эй, Авинаш, добро пожаловать в Stack Overflow. Я внес некоторые улучшения в ваш код, и я показываю, что я их сделал, шаг за шагом. Проверьте это здесь .
3. Александр спасибо за улучшения. Я действительно ценю ваши усилия.
Ответ №1:
пришлось добавить еще один ответ благодаря тем, кто голосует без особой помощи.
попробуйте это
if let episode = (episodes.filter { $0.1.contains { $0.episodeName == "eight" } }).first {
print(episode.0) // season2
}
Комментарии:
1. Большое вам спасибо, коропок. это похоже на спасительное решение.
Ответ №2:
Вот рабочее решение.
struct EpisodeInfoData {
let episodeId: String
let episodeName: String
}
let episodes = [
"season1": [
EpisodeInfoData(
episodeId: "1",
episodeName: "one"
),
EpisodeInfoData(
episodeId: "2",
episodeName: "two"
),
EpisodeInfoData(
episodeId: "3",
episodeName: "three"
),
EpisodeInfoData(
episodeId: "4",
episodeName: "four"
),
],
"season2": [
EpisodeInfoData(
episodeId: "5",
episodeName: "five"
),
EpisodeInfoData(
episodeId: "6",
episodeName: "six"
),
EpisodeInfoData(
episodeId: "7",
episodeName: "seven"
),
EpisodeInfoData(
episodeId: "8",
episodeName: "eight"
)
]
]
let desiredName = "eight"
let result = episodes.filter{ _, seasonEpisodes in
return seasonEpisodes.contains{ $0.episodeName == desiredName }
}.map{ key, value in return key}
print(result)
Сначала фильтруется словарь эпизодов. Пары ключ-значение в словаре сохраняются только в том случае, если значение ( seasonEpisodes
массив) содержит эпизод с desiredName
. Затем эти пары ключ-значение сопоставляются, и возвращаются только ключи (названия сезонов).