I am trying to implement the Country Codes in my app for Phone Auth Login. This is a SwiftUI app using iOS 17 and below is the code i am using to implement this but it is printing out the full Country Name rather than the 2 letters of the country as listed at Country Codes.
I was able to find some information at a previous post by another user: Getting country name from country code but this just displayed the Country in full name and not in the 2-letter format.
Below is the Code acquired:
Getting Country Code:
func getCountryCode() -> String {
let regionCode = Locale.current.region?.identifier ?? ""
return countries[regionCode] ?? ""
}
Getting Country Name:
func countryName(countryCode: String) -> String? {
let current = Locale(identifier: Locale.current.identifier)
return current.localizedString(forRegionCode: countryCode)
}
Implementing code in my LoginView:
HStack {
// displays CountryName: full NOT 2-letter identifier
Text("\(loginData.countryName(countryCode: regionCode) ?? "")")
// displays CountryCode
Text("+ \(loginData.getCountryCode())")
}
When i display the above in my app, this is how it is displayed:
United States +1
How I need it displayed:
US +1
to get the country codes, you could try this approach, for example with country code in a HStack
.
Example code:
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(" + ....")
}
}
}
}
EDIT-1:
a more principled code version:
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))
}
}
}
}
}