2016-09-17 51 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