2016-09-20 18 views
33

Bạn có thể vui lòng giúp đỡ về cách lấy mã quốc gia bằng cách sử dụng NSLocale trong Swift 3?Cách lấy mã quốc gia bằng cách sử dụng NSLocale trong Swift 3

Đây là mã trước tôi đã sử dụng.

NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String 

tôi có thể nhận Mã ngôn ngữ như sau trong Swift 3.

Locale.current.languageCode! 

Như tôi đã có thể thấy, lấy languageCode là thẳng về phía trước nhưng sở hữu countryCode không có sẵn.

+1

Cách tiếp cận tương tự như trong http://stackoverflow.com/a/39519359/1187415 cũng hoạt động ở đây: '(Locale.current as NSLocale) .object (forKey: .countryCode)'. –

+0

Tôi có thể thấy hoạt động. Cảm ơn bạn đã giúp đỡ. – digidhamu

+0

let locale = Locale.current print (locale.regionCode) –

Trả lời

41

Xem Wojciech N.'s answer để có giải pháp đơn giản hơn!


Tương tự như trong NSLocale Swift 3, bạn phải đúc các loại lớp phủ Locale trở lại của nó đối Foundation NSLocale để lấy mã quốc gia:

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String { 
    print(countryCode) 
} 
44

Bạn có thể sử dụng tài sản mã vùng trên Locale struct.

Locale.current.regionCode 

Nó không được ghi nhận như là thay thế cho cấu trúc NSLocaleCountryCode cũ nhưng có vẻ như vậy. Đoạn mã sau kiểm tra mã quốc gia cho tất cả các ngôn ngữ đã biết và so sánh chúng với mã vùng. Chúng giống hệt nhau.

public func ==(lhs: [String?], rhs: [String?]) -> Bool { 
    guard lhs.count == rhs.count else { return false } 

    for (left, right) in zip(lhs, rhs) { 
     if left != right { 
      return false 
     } 
    } 

    return true 
} 

let newIdentifiers = Locale.availableIdentifiers 
let newLocales = newIdentifiers.map { Locale(identifier: $0) } 
let newCountryCodes = newLocales.map { $0.regionCode } 

let oldIdentifiers = NSLocale.availableLocaleIdentifiers 
newIdentifiers == oldIdentifiers // true 

let oldLocales = oldIdentifiers.map { NSLocale(localeIdentifier: $0) } 
let oldLocalesConverted = oldLocales.map { $0 as Locale } 
newLocales == oldLocalesConverted // true 

let oldComponents = oldIdentifiers.map { NSLocale.components(fromLocaleIdentifier: $0) } 
let oldCountryCodes = oldComponents.map { $0[NSLocale.Key.countryCode.rawValue] } 
newCountryCodes == oldCountryCodes // true 
+0

Thật tuyệt vời! Tình yêu nó mà bạn về cơ bản đã chứng minh phỏng đoán của bạn. Tôi biết câu trả lời được lựa chọn là đúng về mặt kỹ thuật, nhưng oh tôi ghét việc bắc cầu tới NSLocale như thế nào. –

-5
print(NSLocale.current.regionCode) 
+0

Điều này giống với câu trả lời của @ wojciech-n từ năm 2016 ... ngoại trừ câu trả lời lỗi thời (nên là Locale trong Swift 3, thay vì NSLocale dành cho Swift 2). – Moritz

0

Nếu bạn chắc chắn rằng bạn đang sử dụng một NSLocale và không phải là một ví dụ Locale, bạn có thể sử dụng countryCode tài sản:

let locale: NSLocale = NSLocale.current as NSLocale 
let country: String? = locale.countryCode 
print(country ?? "no country") 
// > Prints "IE" or some other country code 

Nếu bạn cố gắng sử dụng countryCode với Swift Locale Xcode sẽ cung cấp cho bạn một lỗi với đề xuất sử dụng regionCode thay thế:

let swiftLocale: Locale = Locale.current 
let swiftCountry: String? = swiftLocale.countryCode 
// > Error "countryCode' is unavailable: use regionCode instead" 
Các vấn đề liên quan