2016-09-12 6 views
32

Po prostu skonwertowano projekt na Swift 3 i nie mogę znaleźć następującego błędu.Swift 3 błąd: Etykiety argumentów (_ :) "nie pasują do dostępnych przeciążeń

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

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

przewód powrotny jest wyświetlany komunikat o błędzie „Etykiety Argument«(_ :)»nie dało żadnych dostępnych przeciążeń”

Każdy pomysł, co trzeba zmienić, aby rozwiązać ten

Odpowiedz

50

Można zrobić to w ten sposób:

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

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

Dzięki, potrzebny NSNumber (wartość: self) –

+0

Chętnie Ci pomożemy ..:) –

+9

Wspaniale, że to działa, ale bez wyjaśnienia, dlaczego rozwiązuje problem, nie jest zbyt pomocne. – Jim

2

Co z tym?

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

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. –

+0

Nie rozumiem. –

+0

Nie rozumiesz co? Edycja, jakość odpowiedzi, ..? –

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! 
} 

Różnica między Syntex

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

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

celu wyjaśnienia niejasności, co jest błąd,

NSNumber dzwoni NSNumber.init(value: X) metody instancji obiekt NSNumber.

„etykiety Argument«(_:)»nie dało żadnych dostępnych przeciążeń”

Kod wywołuje błąd, ponieważ NSNumber nie jest typem raczej jest to klasa z członków. "NSNumber(...)" tworzy instancję obiektu klasy zawierającego wartość "" z (1.0/1.29).

To nie jest konwersja typu lub rzut jak w C/C++. gdzie próbujesz uzyskać obsada typu umożliwiającego kompilatorowi wykonywanie pracy.

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

NSNumber nie jest typem jak int, float, char

błędu wchodzi w grę, ponieważ istnieje kilka sposobów, aby zadzwonić NSNumber.init(value: type)

Swift jest wymóg, że wyraźnie powiedzieć, że chcesz człon „wartość” numeru NSNumber, aby zawierał wartość x.

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) 

Może wystąpić zamieszanie, ponieważ to działa.

w = String("4") 

String klasa nie wymaga etykiety argument podczas NSNumber wymaga etykietę argument „Wartość:”

Może to ze względu na to, jak traktuje NSNumber IOS jako pochodzące ze spuścizny?