Инициализация KeyValuePairs из массива, из словаря - PullRequest
0 голосов
/ 30 октября 2019

Согласно документу, KeyValuePairs - это облегченная коллекция пар ключ-значение. Очень похоже на заказанный словарь . KeyValuePairs имеет инициализатор похожий на инициализацию из литерала. Но, в отличие от неупорядоченного аналога, в нем отсутствуют начальные числа из последовательностей кортежей ключ-значение. Можем ли мы добавить больше единиц, чтобы получить KeyValuePairs из последовательностей, коллекций или словаря или хотя бы из массива кортежей?

Например, мне нужна отсортированная версия такого словаря

static var allRegionIsoCodesWithNames: Dictionary<String, String> {
    get {
        return Dictionary(uniqueKeysWithValues: Locale.isoRegionCodes.map({ ($0, String.emojiFlag(for: $0)!  + LWUserDefaults.locale.localizedString(forRegionCode: $0)!) }).sorted(by: { $0.0 < $1.0 }))
    }
}
/* A useless code since ordering is not applyed */

Мне нужно, чтобы это работало

static var allRegionIsoCodesWithNamesKeyVal: KeyValuePairs<String, String>? {
    get {
        return Array(Locale.isoRegionCodes.map({ ($0, String.emojiFlag(for: $0)!  + LWUserDefaults.locale.localizedString(forRegionCode: $0)!) }).sorted(by: { $0.0 < $1.0 }))
    }
}
/* Cannot convert return expression of type '[(String, String)]' to return type 'KeyValuePairs<String, String>?' */

Для того, чтобы воспроизвести здесь, String.emojiFlag (для справки):

extension String {
    static func emojiFlag(for countryCode: String) -> String? {
        func isLowercaseASCIIEnglishLetterScalar(_ scalar: Unicode.Scalar) -> Bool {
            return scalar.value >= Unicode.Scalar("a").value && scalar.value <= Unicode.Scalar("z").value
        }

        func regionalIndicatorSymbol(for scalar: Unicode.Scalar) -> Unicode.Scalar {
            precondition(isLowercaseASCIIEnglishLetterScalar(scalar))
            return Unicode.Scalar(scalar.value + (0x1F1E6 - 0x61))!
        }

        let lowercasedCode = countryCode.lowercased()
        guard lowercasedCode.unicodeScalars.allSatisfy(isLowercaseASCIIEnglishLetterScalar) else {return nil }

        let indicatorSymbols = lowercasedCode.unicodeScalars.map({ regionalIndicatorSymbol(for: $0) })
        return String(indicatorSymbols.map({ Character($0) }))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...