Я пытаюсь реализовать коды стран в своем приложении для входа в систему с помощью телефона. Это приложение SwiftUI, использующее iOS 17, и ниже приведен код, который я использую для его реализации, но он распечатывает полное название страны, а не две буквы страны, как указано в Коды стран.
Мне удалось найти некоторую информацию в предыдущем сообщении другого пользователя: Получение названия страны из кода страны, но при этом страна отображалась полностью, а не в двухбуквенном формате.
Ниже приведен полученный код:
Получение кода страны:
func getCountryCode() -> String {
let regionCode = Locale.current.region?.identifier ?? ""
return countries[regionCode] ?? ""
}
Получение названия страны:
func countryName(countryCode: String) -> String? {
let current = Locale(identifier: Locale.current.identifier)
return current.localizedString(forRegionCode: countryCode)
}
Реализация кода в моем LoginView:
HStack {
// displays CountryName: full NOT 2-letter identifier
Text("\(loginData.countryName(countryCode: regionCode) ?? "")")
// displays CountryCode
Text("+ \(loginData.getCountryCode())")
}
Когда я показываю вышеизложенное в своем приложении, оно отображается следующим образом:
United States +1
Как мне нужно, чтобы это отображалось:
US +1
То есть отображать страны и коды в модальном режиме.
Этот вопрос похож на: Как получить код страны с помощью NSLocale в Swift 3. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.





чтобы получить коды стран, вы можете попробовать этот подход, например, с кодом страны в HStack.
Пример кода:
struct ContentView: View {
let countryCodes = Locale.Region.isoRegions.compactMap{$0.identifier}
var body: some View {
List(countryCodes, id: \.self) { code in
HStack {
Text(code)
Text(" + ....")
}
}
}
}
РЕДАКТИРОВАТЬ-1:
более принципиальная версия кода:
struct Country: Identifiable {
let id = UUID()
var name: String
var code: String
// others, eg telephone code
}
struct ContentView: View {
@State private var countries: [Country] = []
var body: some View {
List(countries) { country in
HStack {
Text(country.code)
Text(" + ....")
}
}
.onAppear {
Locale.Region.isoRegions.compactMap{$0.identifier}.forEach{ code in
if let name = Locale(identifier: code).localizedString(forRegionCode: code) {
countries.append(Country(name: name, code: code))
}
}
}
}
}
Что такое
countriesв первом фрагменте кода? Вам это не нужно. Если я правильно понимаю, прямой возвратregionCodeдолжен быть тем, что вам нужно.uppercased()если хотите.