37 votes

erreur swift 3 : Les étiquettes d'arguments '(_ :)' ne correspondent à aucune surcharge disponible.

Je viens de convertir un projet en Swift 3 et je ne comprends pas l'erreur suivante.

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

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

la ligne de retour affiche une erreur "Les étiquettes d'arguments '(_ :)' ne correspondent à aucune surcharge disponible".

Une idée de ce qu'il faut changer pour résoudre ce problème

56voto

Dharmesh Kheni Points 47063

Vous pouvez le faire de cette façon :

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

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

Parce que si vous vérifiez NSNumber vous obtiendrez des inits prédéfinis comme :

public init(value: Int)

3 votes

Merci, j'avais besoin de NSNumber(value : self)

0 votes

Heureux de vous aider :)

12 votes

C'est bien que cela fonctionne, mais sans une explication de la raison pour laquelle cela résout le problème, ce n'est pas très utile.

10voto

Vanderdecken Points 115

Pour clarifier la confusion quant à la nature de l'erreur,

Le numéro NSN appelle NSNumber.init( value: X ) pour instancier un objet NSNumber.

"Étiquettes d'arguments (_:) ne correspondent à aucune surcharge disponible".

Le code produit l'erreur car NSNumber n'est pas un type mais une classe avec des membres. "NSNumber(...)" instancie un objet de classe qui contient l'élément ' valeur de (1.0 / 1.29) .

Il ne s'agit pas d'une conversion de type ou d'un cast comme en C/C++. où vous essayez de moulage le type pour permettre au compilateur de faire son travail.

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

NSNumber n'est pas un type comme int, float, char

L'erreur entre en jeu car il existe plusieurs façons d'appeler NSNumber.init( value: type )

Swift exige que vous indiquiez spécifiquement que vous souhaitez que le membre " value " du NSNumber contienne la valeur 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 )

La confusion est peut-être en train de s'installer parce que ça marche.

w = String( "4" )

La classe String n'a pas besoin de l'étiquette de l'argument, tandis que NSNumber a besoin de l'étiquette de l'argument 'value:'.

Peut-être est-ce dû à la façon dont IOS traite le NSNumber comme provenant d'un héritage ?

2voto

Et ça ?

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

6 votes

Bien que cet extrait de code puisse résoudre la question, y compris une explication contribue vraiment à améliorer la qualité de votre article. N'oubliez pas que vous répondez à la question pour les lecteurs à venir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.

0 votes

Je ne comprends pas.

0 votes

Ne pas comprendre quoi ? L'édition, la qualité des réponses, ?

0voto

Sulthan Points 23360

Alors que la réponse acceptée montre comment NSNumber devrait être appelé correctement, il est bon de savoir qu'il n'y a aucune raison de convertir les nombres Swift en NSNumber si nous utilisons le string(for:) au lieu de string(from:) .

return formatter.string(for: self)!

0voto

Vivek Points 1218

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

Différence entre syntex

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X