Ошибка swift 3: метки аргумента '(_:)' не соответствуют ни одной из доступных перегрузок

Просто конвертировал проект в Swift 3 и не могу понять следующую ошибку.

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

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

в обратной строке отображается сообщение об ошибке "Метки аргумента (_:)'не соответствуют ни одной из доступных перегрузок"

Любая идея, что нужно изменить, чтобы решить эту проблему

4 ответа

Решение

Вы можете сделать это следующим образом:

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

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

Чтобы прояснить путаницу относительно ошибки,

NSNumber звонит NSNumber.init( value: X ) метод для создания объекта NSNumber.

"Аргумент метки" (_:) 'не соответствуют никаким доступным перегрузкам'

Код генерирует ошибку, потому что NSNumber не является типом, а является классом с членами. "NSNumber(...)" создает экземпляр объекта класса, который содержит " значение" (1.0 / 1.29),

Это не преобразование типа или приведение, как в C/C++. где вы пытаетесь привести тип, чтобы компилятор мог выполнять свою работу.

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

NSNumber не похож на тип int, float, char

Ошибка вступает в игру, потому что есть несколько способов вызова NSNumber.init( value: type )

Swift требует, чтобы вы прямо сказали, что хотите, чтобы элемент 'value' NSNumber содержал значение 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 )

Может возникнуть путаница, потому что это работает.

w = String( "4" )

Класс String не требует метки аргумента, в то время как NSNumber действительно требует метки аргумента 'value:'

Возможно, это связано с тем, как IOS относится к NSNumber как к наследию?

Как насчет этого?

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

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

Разница между синтаксисом

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

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

В то время как принятый ответ показывает, как NSNumber инициализатор должен быть вызван правильно, это хорошо знать, что нет причин для преобразования чисел Swift в NSNumber если мы используем string(for:) метод вместо string(from:),

return formatter.string(for: self)!
Другие вопросы по тегам