我刚刚更新到Xcode 6 GM,我正在解决一些已经出现的问题。大多数事情现在都在运作,但我遇到了一个错误,我不确定如何纠正。
我在vieDidLoad()中有这段代码:
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
currencyFormatter.currencyCode = NSLocale.currentLocale().displayNameForKey(NSLocaleCurrencySymbol, value: NSLocaleCurrencyCode)!
我在第二行收到错误。
fatal error: unexpectedly found nil while unwrapping an Optional value
我确信解决方案很简单,但我对编程很新,所以我找不到修复方法。
答案 0 :(得分:3)
您使用错误的方法获取货币代码。这不会是一个问题,该方法只返回nil
,因为它找不到值。但是你通过添加!
明确地展开了可选项,应该避免使用。
我建议使用以下代码:
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
let locale = NSLocale.currentLocale()
if let currencyCode = locale.objectForKey(NSLocaleCurrencyCode) as? String {
currencyFormatter.currencyCode = currencyCode
}
这仅设置objectForKey
方法返回的货币代码。正如POB在下面的评论中正确指出的那样,objectForKey
会返回AnyObject?
。在这种情况下,可以安全地添加as? String
,将其转换为String?
。
答案 1 :(得分:2)
currencyCode
的{{1}}属性属于currencyFormatter
类型。如果要将其设置为设备的当前区域设置货币代码,则必须使用以下代码:
String
然而,正如Guido Hendriks所指出的那样,let currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
currencyFormatter.currencyCode = NSLocale.currentLocale().objectForKey(NSLocaleCurrencyCode) as String
println(currencyFormatter.currencyCode) //Will display "USD", for example
会返回objectForKey:
。 Swift编程语言建议使用可选绑定,以便安全地打开选项。因此,您的代码应如下所示:
AnyObject?