【问题标题】:swift 3 error : Argument labels '(_:)' do not match any available overloadsswift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载
【发布时间】:2017-01-19 12:22:48
【问题描述】:

刚刚将一个项目转换为 Swift 3,但无法弄清楚以下错误。

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

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

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

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

【问题讨论】:

    标签: swift swift3


    【解决方案1】:

    你可以这样做:

    public func currencyString(_ decimals: Int) -> String {
    
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.maximumFractionDigits = decimals
        return formatter.string(from: NSNumber(value: decimals))!
    }
    

    因为如果您检查NSNumber,您将获得预定义的初始化,如:

    public init(value: Int)
    

    【讨论】:

    • 谢谢,需要 NSNumber(value: self)
    • 很高兴为您提供帮助.. :)
    • 这很好,但没有解释为什么它解决了问题,它不是很有帮助。
    【解决方案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)
    }
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • 我不明白。
    • 不明白什么?编辑,答案质量,..?
    • 请解释提供的示例如何帮助回答原始问题中的问题。
    【解决方案3】:

    斯威夫特 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)
    

    【讨论】:

      【解决方案4】:

      为了澄清错误是什么的混淆,

      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 要求您明确说明您希望 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 视为来自旧版?

      【讨论】:

        【解决方案5】:

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

        return formatter.string(for: self)!
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多