2014-09-10 89 views
0

我刚更新到Xcode 6 GM,我正在修复一些已出现的问题。现在大部分工作正在进行,但是我遇到了一个错误,我不确定如何纠正。更新到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

当您使用显式展开时,确保结果永远不会为零。相反,不要使用显式的解包和测试nil,并使用'if'来避免零。 – zaph 2014-09-10 13:39:31

回答

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?

+0

您的代码将生成警告和Xcode 6 GM的错误消息。为了解决它,你应该改变你的第二行:'如果让currencyCode = NSLocale.currentLocale()。objectForKey(NSLocaleCurrencyCode)为?字符串{'。 – 2014-09-10 13:56:29

2

currencyCodecurrencyFormatter的财产属于String类型。当你想将其设置为您的设备的当前区域货币代码,您必须使用下面的代码:

let currencyFormatter = NSNumberFormatter() 
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 
currencyFormatter.currencyCode = NSLocale.currentLocale().objectForKey(NSLocaleCurrencyCode) as String 
println(currencyFormatter.currencyCode) //Will display "USD", for example 

然而,作为圭多亨德里克斯指出,objectForKey:回报AnyObject?Swift编程语言建议使用可选绑定来安全地打开可选项。因此,您的代码应该如下所示:

let currencyFormatter = NSNumberFormatter() 
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 
if let currencyCode = NSLocale.currentLocale().objectForKey(NSLocaleCurrencyCode) as? String { 
    currencyFormatter.currencyCode = currencyCode 
    println(currencyFormatter.currencyCode) //Will display "USD", for example 
} 
+0

通过这种方式,您可以将'AnyObject?'向下翻转为'String',也可以解开可选项。如果它是'nil',会使应用程序崩溃。 – 2014-09-10 14:04:38

+0

@Guido Hendriks:更新。谢谢。 – 2014-09-10 14:20:05