Ошибка 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)!