你假设一个地区内的每个语言群体都使用相同的货币。这确实是真实的,但不能保证(人类非常不一致)。但事实确实如此,所以我们可以利用这一点。
首先,让我们证明目前确实如此,这样你就可以检测它是否为真。为了做到这一点,创建所有的语言环境(这是一个你以后需要尝试的技巧,值得一试)。
let locales = Locale.availableIdentifiers.map(Locale.init(identifier:))
现在,将每个地区映射到该地区使用的每种货币:
let currencies = Dictionary(grouping: locales,
by: { $0.region?.identifier ?? ""})
.mapValues { $0.compactMap { $0.currency?.identifier }}
这个的输出结果是按照以下模式排列的:
["BZ": ["BZD", "BZD"], "MR": ["MRU", "MRU", "MRU", "MRU"], ...
那么问题是:是否有一些地区使用多种货币?
let allMatch = currencies.values
.filter { list in !list.allSatisfy { $0 == list.first }}
.isEmpty // true
很好。这个假设似乎可行。我们可以在一个拥有货币的地区中选择任意一种随机语言,该货币应该是该地区的货币。
既然可以随便选一种语言,那就这么做吧:
let isoCountryCode = "GB"
let locale = Locale.availableIdentifiers.lazy
.map(Locale.init(identifier:))
.first(where: { $0.region?.identifier == isoCountryCode && $0.currency != nil })
locale?.currency?.identifier
顺便说一下,我的机器选择了康沃尔语(kw)作为语言,而不是英语,但这没关系。假设任何地区语言都有相同的货币。