Как отфильтровать объекты массива, 7-й символ которого является двоеточием? - PullRequest
0 голосов
/ 02 сентября 2018

Редактировать: Спасибо всем! Чтобы облегчить жизнь в будущем, я думаю, что я попытаюсь преобразовать строки в отдельные фрагменты информации, как предложили несколько человек. Я начинающий программист, поэтому мне будет полезно узнать, как это сделать. Еще раз спасибо.

Основной вопрос: Как добавить второй фильтр, который будет выбирать строки массива, седьмой символ которого является двоеточием?

Объяснение: Хорошо, это действительно конкретный вопрос, но мне нужно настроить фильтр массива, который сможет извлекать определенные строки, если двоеточие находится в определенной точке. Я создаю генератор случайных эпизодов, основанный на массивах, где эпизоды записываются как «EP:», т.е. «EP102: Cool Episode». Пользователи также могут выбрать сезон, который они хотят смотреть. Это происходит путем фильтрации строк эпизода, которые содержат «EP (указанный номер сезона)» и выбирают только из них. Проблема заключается в том, что когда в шоу более 9 сезонов, например, при выборе из 10 сезона, программа выберет несколько из более чем только указанных сезонов. Например, при выборе из S10, чьи эпизоды обозначены как EP1014, также можно выбрать первые 9 эпизодов из S1, так как они содержат EP10 (полное: EP105).

Мое теоретическое решение состоит в том, чтобы добавить еще один фильтр, если номер сезона> = 10, который гарантирует, что двоеточие является седьмым символом в строке, поскольку это не будет справедливо для строк эпизода в сезонах менее 10.

Существующий фильтр:

selectFriendsSeasons = epFriends.filter { $0.contains("EP\(seasonNum)")}

Пожалуйста, не стесняйтесь задавать дополнительные вопросы о ситуации. Спасибо!

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Вы действительно должны использовать структуру для представления эпизода, а не играть со строками.

Вы можете проверить положение двоеточия, используя:

$0.index(of: ":") == $0.index($0.startIndex, offsetBy: 6)
0 голосов
/ 02 сентября 2018

Если вы не хотите создавать правильное struct, которое бы упростило моделирование ваших данных, тогда я бы предложил вам изменить способ кодирования сезонов на 2 цифры вместо 1. И таким образом, ваш оператор фильтра будет выглядеть как:

let seasonNumString = String(seasonNum)
let formattedSeasonNumString: String = seasonNum > 10 ? seasonNumString : "0" + seasonNumString
selectFriendsSeasons = epFriends.filter { $0.contains(formattedSeasonNumString)}
0 голосов
/ 02 сентября 2018

Вам просто нужно получить целочисленное значение и поделить на 100, чтобы получить сезон и обрезать остаток от деления для эпизода:

let array = ["EP102: Just an Episode from season 1", "EP1002: Cool Episode from season 10"]
let episodes: [(season: String, episode: String, name: String)] = array.compactMap { string -> (String, String, String)? in
    if let range = string.range(of: ":"){
        if let number = Int(string[..<range.lowerBound].dropFirst(2)) {
            print(number)
            let season = number / 100
            let episode = number % 100
            return (String(season), String(episode),String(string[range.upperBound...]))
        }
    }
    return nil
}

episodes.first!.season   // "1"
episodes.first!.episode  // "2"
episodes.first!.name     // " Just an Episode from season 1"

Если вы хотите расширить его, вы можете создать структуру Custon TVSerie со всеми этими свойствами и отобразить результат:

struct TVSerie {
    let season: String
    let episode: String
    let name: String
}

let series = episodes.map(TVSerie.init)  // [{season "10", episode "2", name " Cool Episode"}]
for serie in series where serie.season == "10" {
    print("season:", serie.season)
    print("episode:", serie.episode)
    print("name:", serie.name)
}

// season: 10
// episode: 2
// name:  Cool Episode from season 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...