Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

swift 3 error : Argument labels '(_:)' do not match any available overloads

Tags:

swift

swift3

Just converted a project to Swift 3 and cant figure out the following error.

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

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

the return line is showing an error "Argument labels '(_:)' do not match any available overloads"

Any idea what needs to change to resolve this

like image 749
Mike U Avatar asked Sep 12 '16 05:09

Mike U


3 Answers

You can do it this way:

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

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

Because if you check NSNumber you will get predefined init like:

public init(value: Int)
like image 86
Dharmesh Kheni Avatar answered Nov 07 '22 06:11

Dharmesh Kheni


To clarify the confusion as to what the error is,

NSNumber is calling NSNumber.init( value: X ) method to instantiate a NSNumber object.

"Argument labels '(_:)' do not match any available overloads"

The code produces the error because NSNumber is not a type rather it is a class with members. "NSNumber(...)" instantiates a class object to contain the 'value' of (1.0 / 1.29).

This is not a type conversion or cast like in C/C++. where you are trying to cast the type to allow the compiler to do its job.

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

NSNumber is not a type like int, float, char

The error comes into play because there are several ways to call NSNumber.init( value: type )

Swift is requiring that you specifically say that you want the 'value' member of the NSNumber to contain the 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 )

The confusion might be coming into play because this works.

w = String( "4" )

The class String does not require the argument label, while NSNumber does require an argument label of 'value:'

Perhaps this is due to how IOS treats NSNumber as coming from legacy?

like image 43
Vanderdecken Avatar answered Nov 07 '22 05:11

Vanderdecken


What about this?

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)
}
like image 2
The Hacking Gamer Avatar answered Nov 07 '22 05:11

The Hacking Gamer