2016-09-17 7 views
4

Ich bin ein wenig verwirrt über einen Konvertierungsfehler.Xcode 8.0 und Swift 3.0 Konvertierung: Suche nach Erklärung für einen bestimmten Konvertierungsfehler

wanderte ich mein Projekt Form Swift 2.3 Swift 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 = "???" 
    } 
} 

Zuerst dachte ich, dass in Swift 3.0 die Besetzung Type(value) jetzt verboten war, aber ich überprüft und ich absolut keine Compiler-Warnung. Kann mir jemand sagen, was das Problem mit NSNumber(value) ist?

Soweit ich es verstehe value as NSNumber und NSNumber(value) sollte das gleiche sein.

Antwort

4

In Swift 3, NSNumber(value) wird nicht funktionieren. Nehmen wir an, Ihr Wert ist ein Int. In diesem Fall benötigen Sie NSNUmber(value: yourIntValue). In Swift 3 müssen Sie den Namen des ersten (und in diesem Fall des einzigen) Parameters im Funktionsaufruf haben. Also, um Ihre Nutzung der

value as NSNumber 

funktioniert, aber

NSNumber(value: yourNumberValue) 

funktioniert auch.

+0

Ok danke, das ist eine Art komische Entscheidung von Apple, aber ich verstehe es jetzt. – Ruvi

0

Als erstes habe ich hier eine Annahme gemacht habe, habe ich angenommen, dass -

numberFormatter = NSNumberFormatter() // Nun hat es NumberFormatter celsiusLabel.text umbenannt ich Text als optionale Zeichenkette nehme nur für Beispiel Sie können label.text für dasselbe verwenden.

Nach der obigen Annahme Code unten sehen Sie, welche in Swift arbeiten 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 = "???" 
    } 
} 

Hoffe, dass es gerne helfen Kommentar im Falle zu verlassen haben Sie Zweifel.

+0

Danke für die Antwort, aber ich kann nicht sehen, wie Ihre Lösung das Problem löst. Ich habe Ihre Lösung versucht und es ist immer noch das gleiche Problem. Die Funktion numberFormatter.string verweigert (in Ihrem Fall) den Wert, da value keine NSNumber ist. Btw: Sorry verpasste die richtigen Typen: numberFormatter = NumberFormatter() celsiusWert: Double? Entschuldigung für die Änderungen, aber immer gedrückt nach unten geben Sie statt Verschiebung eingeben – Ruvi

+0

Ok Ich habe den Code für den doppelten Wert die richtige Syntax für NSNumber Initialisierung ist die gleiche wie die obige Antwort ie - NSNumber (Wert: Wert) – Jeet