2016-09-12 3 views
32

Habe gerade ein Projekt in Swift 3 konvertiert und kann den folgenden Fehler nicht berechnen.swift 3 error: Argumentbezeichnungen '(_ :)' stimmen nicht mit vorhandenen Überladungen überein

public func currencyString(_ decimals: Int) -> String { 

    let formatter = NumberFormatter() 
    formatter.numberStyle = .currency 
    formatter.maximumFractionDigits = decimals 
    return formatter.string(from: NSNumber(self))! 
} 

die Rückleitung einen Fehler zeigt „Argument Labels‚(_ :)‘passen nicht alle verfügbaren Überlastungen“

Jede Idee, was dieses Bild Sie

Antwort

50

auflösen muss sich ändern tun können es auf diese Weise:

public func currencyString(_ decimals: Int) -> String { 

    let formatter = NumberFormatter() 
    formatter.numberStyle = .currency 
    formatter.maximumFractionDigits = decimals 
    return formatter.string(from: NSNumber(value: decimals))! 
} 
+3

Danke, benötigte NSNummer (Wert: self) –

+0

Glücklich, Ihnen zu helfen ..:) –

+9

Großartig, dass das funktioniert, aber ohne eine Erklärung, warum es das Problem löst, ist es nicht sehr hilfreich. – Jim

2

Was ist damit?

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "backButton") 
     self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "backButton") 
     self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", barButtonSystemItem: UIBarButtonItemStyle.Plain, target: nil, action: nil) 
} 
+5

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erläuterung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) hilft wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. –

+0

Ich verstehe es nicht. –

+0

Nicht bekommen was? Bearbeiten, Antwortqualität, ..? –

0

Swift 3.0.1

public func currencyString(_ decimals: Int) -> String { 
    let numberFormatter = NumberFormatter() 
    numberFormatter.numberStyle = .currency 
    numberFormatter.formatterBehavior = .default 
    let priceString = numberFormatter.string(from: NSNumber(value:product.introPrice)) 
    return priceString! 
} 

Unterschied zwischen syntex

// Old code 
formatter.string(from: NSNumber(product.introPrice))! 

// swift 3.0.1 
formatter.string(from: NSNumber(value:product.introPrice) 
3

die Verwirrung in Bezug auf klären, was der Fehler ist,

NSNumber ruft NSNumber.init(value: X) Methode zu instanziiert ein NSNumber-Objekt

„Argument Etiketten (_:) 'passen nicht alle verfügbaren Überlastungen“

Der Code, der den Fehler erzeugt, da NSNumber kein Typ ist vielmehr ist es eine Klasse mit den Mitgliedern. "NSNumber(...)" instanziiert ein Klassenobjekt, das den Wert 'Wert' von (1.0/1.29) enthält.

Dies ist keine Typumwandlung oder Umwandlung wie in C/C++. wo Sie versuchen, Besetzung der Typ, damit der Compiler seine Arbeit machen kann.

float y = 1.3; 
int x = int(y); 

NSNumber ist kein Typ wie int, float, char

Der Fehler kommt ins Spiel, weil es mehrere Möglichkeiten gibt, NSNumber.init(value: type) zu nennen

Swift wird verlangt, dass Sie ausdrücklich sagen, dass Sie den ‚Wert‘ Mitglied wollen der NSNumber, um den Wert x zu enthalten.

let localRate = NSNumber(1.0/1.29) 
    var y = NSNumber(0) 
    var b = NSNumber(false) 



    let localRate = NSNumber(value: 1.0/1.29) 
    var y = NSNumber(value: 0) 
    var b = NSNumber(value: false) 

Die Verwirrung könnte ins Spiel kommen, weil dies funktioniert.

w = String("4") 

Die Klasse String, nicht das Argument Etikett benötigen, während NSNumber ein Argument Label erfordert 'Wert:'

Vielleicht ist dies darauf zurückzuführen, wie IOS behandelt NSNumber wie aus Legacy kommt?

Verwandte Themen