swift 3错误:参数标签'(_ :)'与任何可用的重载都不匹配

Mik*_*e U 37 swift swift3

刚刚将项目转换为Swift 3并且无法找出以下错误.

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

    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.maximumFractionDigits = decimals
    return formatter.string(from: NSNumber(self))!
}
Run Code Online (Sandbox Code Playgroud)

返回行显示错误"Argument labels'(_ :)'与任何可用的重载都不匹配"

知道需要改变什么来解决这个问题

Dha*_*esh 56

你可以这样做:

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

    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.maximumFractionDigits = decimals
    return formatter.string(from: NSNumber(value: decimals))!
}
Run Code Online (Sandbox Code Playgroud)

  • 伟大的,这是有效的,但没有解释为什么它解决了问题,它不是很有帮助. (12认同)
  • 谢谢,需要NSNumber(价值:自我) (3认同)

小智 10

澄清关于错误是什么的混淆,

NSNumber正在调用NSNumber.init( value: X )实例化NSNumber对象的方法.

"参数标签' (_:)'与任何可用的重载都不匹配"

代码产生错误,因为NSNumber不是类型,而是具有成员的类."NSNumber(...)"实例化一个类对象包含" 值"(1.0 / 1.29).

这不是C/C++中的类型转换或转换.你在哪里试图的类型,让编译器来完成其工作.

float y = 1.3;
int x = int( y );
Run Code Online (Sandbox Code Playgroud)

NSNumber不是类似的类型 int, float, char

错误发挥作用,因为有几种方法可以调用 NSNumber.init( value: type )

Swift要求你明确地说你希望NSNumber的'value'成员包含值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 )
Run Code Online (Sandbox Code Playgroud)

混乱可能会发挥作用,因为这是有效的.

w = String( "4" )
Run Code Online (Sandbox Code Playgroud)

类String不需要参数标签,而NSNumber确实需要参数标签'value:'

也许这是因为IOS如何将NSNumber视为来自传统?