2016-09-17 57 views
4

我对转换错误有点困惑。Xcode 8.0和Swift 3.0转换:寻找特定转换错误的解释

我迁移我的项目形式雨燕2.3〜3.0雨燕

func updateCelsiusLabel() { 

    if let value = celsiusValue { 

     //This was the original code (that worked but is) failing after migration 
     //due to: Argument labels do not match any available overloads 
     celsiusLabel.text = numberFormatter.string(from: NSNumber(value)) 


     //This is my code trying to fix this issue and the project is now compiling 
     //and everything is fine 
     celsiusLabel.text = numberFormatter.string(from: value as NSNumber) 

    } 
    else { celsiusLabel.text = "???" 
    } 
} 

起初我还以为是在雨燕3.0投Type(value)是现在不允许,但我检查,我得到绝对没有编译器警告。有人可以告诉我NSNumber(value)的问题是什么?

据我所知value as NSNumberNSNumber(value)应该是一样的东西。

回答

4

在Swift 3中,NSNumber(value)不起作用。假设你的价值是一个Int。在这种情况下,你需要NSNUmber(value: yourIntValue)。在Swift 3中,你必须具有函数调用中第一个(在这个例子中是唯一的)参数的名称。所以,你的

value as NSNumber 

作品的使用,但

NSNumber(value: yourNumberValue) 

工作过。

+0

好的谢谢,这是从苹果奇怪的决定,但我现在得到它。 – Ruvi

0

首先我已经采取了一些在这里的假设,我假设 -

的NumberFormatter = NSNumberFormatter()//现在已更名为NumberFormatter类 celsiusLabel.text我以文字为可选的字符串,只是例如,你可以使用label.text。

上述假设后,请参见下面的代码将在斯威夫特工作3 -

var celsiusValue:Double? 
var numberFormatter = NumberFormatter() 
var text:String? 
func updateCelsiusLabel() { 

    if let value = celsiusValue { 

     //This was the original code (that worked but is) failing after migration due to: Argument labels do not match any available overloads 
     text = numberFormatter.string(from: NSNumber(value: value))! 

    } 
    else { 
     text = "???" 
    } 
} 

希望它可以帮助随时离开的情况下,评论您有任何疑问。

+0

感谢您的答案,但我看不出您的解决方案如何解决问题。 我试过你的解决方案,它仍然是同样的问题。 numberFormatter.string函数拒绝(在你的情况)取值,因为值不是一个NSNumber。 btw:对不起,错过了正确的类型: numberFormatter = NumberFormatter() celsiusValue:Double? 对不起编辑,但总是按下输入,而不是移位输入 – Ruvi

+0

好吧我已经更新了双值的代码NSNumber初始化的正确语法是与上面的答案相同,即 - NSNumber(value:value) – Jeet