TheValyreanGroup TheValyreanGroup - 29 days ago 6
Swift Question

Swift operator "*" throwing error on two Ints

I have a very odd error here and i've searched all around and i have tried all the suggestions. None work.

scrollView.contentSize.height = 325 * globals.defaults.integer(forKey: "numCards")



Binary operator '*' cannot be applied to two 'Int' operands


WTF Swift! Why not? I multiply
Ints
all the time. These ARE two
Ints
.
globals.defaults
is just an instance of
UserDefaults.standard
. I have tried the following with the same error each time.

325 * Int(globals.defaults.integer(forKey: "numCards") //NOPE

Int(325) * Int(globals.defaults.integer(forKey: "numCards")) //NOPE

if let h = globals.defaults.integer(forKey: "numCards"){
325 * h //NOPE, and 'Initializer for conditional binding must have optional type, not Int'
}

let h = globals.defaults.integer(forKey: "numCards") as! Int
325 * h //NOPE, and 'Forced cast of Int of same type as no affect'

325 * 2 //YES! But no shit...


All of those "attempts" seemed like a waste of time as i know for a fact both of these are
Ints
...and i was correct. Please advise. Thanks!

Answer

The error is misleading. The problem is actually the attempt to assign an Int value to a CGFloat variable.

This will work:

scrollView.contentSize.height = CGFloat(325 * globals.defaults.integer(forKey: "numCards"))

The cause of the misleading error (thanks to Daniel Hall in the comments below) is due to the compiler choosing the * function that returns a CGFloat due to the return value needed. This same function expects two CGFloat parameters. Since the two arguments being provided are Int instead of CGFloat, the compiler provides the misleading error:

Binary operator '*' cannot be applied to two 'Int' operands

It would be nice if the error was more like:

Binary operator '*' cannot be applied to two 'Int' operands. Expecting two 'CGFloat' operands.