Как правильно расширить TimeZone в Swift для инициализации случайного элемента? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь расширить TimeZone в Swift, чтобы я мог инициализировать его, чтобы получить случайную зону TimeZone.Я приземлился ниже, но есть пара вещей, которые кажутся неправильными.

   init?(random: Bool = false) {
    if random {
        let randomIdentifier = TimeZone.knownTimeZoneIdentifiers.randomElement()!
        self.init(identifier: String(randomIdentifier))
    } else {
        return nil
    }
}

Во-первых, когда я инициализирую случайный элемент и печатаю результат, кажется, что добавлено '(исправлено)'до конца - что может быть причиной этого, пожалуйста?

Во-вторых, это даже правильный подход к этой проблеме?Кажется странным, что я бы даже дал возможность инициализировать с помощью «false», так как другие инициализаторы предлагают все другие неслучайные инициализации.

Любые мысли будут высоко оценены!

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Одним из решений может быть

extension TimeZone {
    static var random: TimeZone? {
        return TimeZone(identifier: TimeZone.knownTimeZoneIdentifiers.randomElement()!)
    }
}

let random = TimeZone.random
random?.identifier // the name you're looking for

Result

Вы даже можете изменить вычисляемую переменную random, чтобы получить необязательный параметр, как вы можетеубедитесь, что knownTimeZoneIdentifiers не пусто.

static var random: TimeZone {
    return TimeZone(identifier: TimeZone.knownTimeZoneIdentifiers.randomElement()!)!
}
0 голосов
/ 22 марта 2019

Часовые пояса хитры, потому что нет определенного стандарта, хотя может показаться, что он есть. Я столкнулся с этой проблемой некоторое время назад и создал этот список из библиотеки Swift:

"HST": "Pacific/Honolulu", -10
"AKST": "America/Juneau", -9
"AKDT": "America/Juneau", -9
"PDT": "America/Los_Angeles", -8
"PST": "America/Los_Angeles", -8
"MST": "America/Phoenix", -7
"MDT": "America/Denver", -7
"CDT": "America/Chicago", -6
"CST": "America/Chicago", -6
"PET": "America/Lima", -5
"COT": "America/Bogota", -5
"EDT": "America/New_York", -5
"EST": "America/New_York", -5
"AST": "America/Halifax", -4
"ADT": "America/Halifax", -4
"NST": "America/St_Johns", -330
"NDT": "America/St_Johns", -330
"CLST": "America/Santiago", -3
"ART": "America/Argentina/Buenos_Aires", -3
"CLT": "America/Santiago", -3
"BRT": "America/Sao_Paulo", -2
"BRST": "America/Sao_Paulo", -2
"GMT": "GMT", 0
"UTC": "UTC", 0
"WET": "Europe/Lisbon", 0
"BST": "Europe/London", 0
"WEST": "Europe/Lisbon", 0
"CEST": "Europe/Paris", +1
"CET": "Europe/Paris", +1
"WAT": "Africa/Lagos", +1
"EEST": "Europe/Athens", +2
"CAT": "Africa/Harare", +2
"EET": "Europe/Athens", +2
"MSK": "Europe/Moscow", +3
"MSD": "Europe/Moscow", +3
"TRT": "Europe/Istanbul", +3
"EAT": "Africa/Addis_Ababa", +3
"IRST": "Asia/Tehran", +330
"GST": "Asia/Dubai", +4
"PKT": "Asia/Karachi", +5
"IST": "Asia/Kolkata", +530
"BDT": "Asia/Dhaka", +6
"ICT": "Asia/Bangkok", +7
"WIT": "Asia/Jakarta", +7
"SGT": "Asia/Singapore", +8
"PHT": "Asia/Manila", +8
"HKT": "Asia/Hong_Kong", +8
"KST": "Asia/Seoul", +9
"JST": "Asia/Tokyo”, +9
"NZDT": "Pacific/Auckland", +13
"NZST": "Pacific/Auckland", +13

Дубликаты показывают, насколько «стандартными» являются эти вещи. Вы можете составить свой собственный список на основе того, что вы считаете правильным, и создать из этого набора законный рандомизатор.

Проблема с ответом Джека в том, что идентификаторы часовых поясов в Swift неравномерны; некоторые зоны перепредставлены, а другие недопредставлены в зависимости от того, сколько регионов Swift считает популярными в этой зоне. В Австралии 12 идентификаторов, хотя в стране, например, только 3 часовых пояса. Чтобы сэкономить время, вы можете просто случайным образом сгенерировать число в диапазоне от -12 часов до +14 часов в секундах и вернуть часовой пояс, используя секунды из GMT.

extension TimeZone {
    static var random: TimeZone? {
        return TimeZone(secondsFromGMT: Int.random(in: -43200...50400))
    }
}

if let t = TimeZone.random {
    print(t)
}

Если вы хотите аккуратное разделение часовых поясов, просто разделите их на блоки и случайным образом выберите из этого набора. Просто поймите, что есть также половина и четверть часовых поясов; не каждый часовой пояс является чистым плюсом или минус 1 час от своего соседа. Если вы используете этот подход, ваш массив будет иметь более 24 целых чисел, что не должно вас беспокоить.

...