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

时间:2016-09-12 05:40:25

标签: 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))!
}

返回行显示错误"参数标签'(_:)'不匹配任何可用的重载"

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

5 个答案:

答案 0 :(得分:56)

你可以这样做:

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)

答案 1 :(得分:9)

澄清错误是什么的混淆,

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 )

斯威夫特要求您明确说明您想要的价值' 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视为来自遗产?

答案 2 :(得分:2)

这个怎么样?

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

答案 3 :(得分:0)

尽管接受的答案显示了如何正确调用NSNumber初始化程序,但很高兴知道,如果我们使用NSNumber方法,则没有理由将Swift数字转换为string(for:)而不是string(from:)

return formatter.string(for: self)!

答案 4 :(得分:-1)

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)