Согласно документу, 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) }))
}
}