Подтвердить что ты не робот

Swift 3 error: Ярлыки аргументов '(_:)' не соответствуют никаким доступным перегрузкам

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Потому что, если вы проверите NSNumber вы получите предопределенный init, например:

public init(value: Int)

Ответ 2

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

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

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

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

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

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

NSNumber не является типом типа int, float, char

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

Swift требует, чтобы вы конкретно сказали, что хотите, чтобы член "значение" 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 как исходящий из наследия?

Ответ 3

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

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

Ответ 4

Хотя принятый ответ показывает, как NSNumber инициализатор NSNumber, полезно знать, что нет смысла конвертировать числа Swift в NSNumber если мы используем метод string(for:) вместо string(from:).

return formatter.string(for: self)!

Ответ 5

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

Разница между syntex

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

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