Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'+' is deprecated: Mixed-type addition is deprecated in Swift 3.1

When I'm directly adding an integer value(i.e: 1,2,3,etc) with another integer variable

let arr:Array = ["One","Two"]
var valueT:Int64 = 0
value = arr.count + 1 //in this line

I get the following warning:

'+' is deprecated: Mixed-type addition is deprecated. Please use explicit type conversion.

I fixed it the warning with this:

value = Int64(value + 1)

Though it is fixed but I wanna know why its called Mixed-type addition as I didn't use ++ . Also is there a better way to fix the warning in swift 3.1?

Update:

The following image is the proof of warning. I'm using Xcode Version 8.3 (8E162).

enter image description here

allROR is an array here.

like image 531
Poles Avatar asked Dec 03 '22 22:12

Poles


2 Answers

Edit: To generate the error with your code it should be like

let value = 5
let result: Int64 = value + 1

Now you get the warning

'+' is deprecated: Mixed-type addition is deprecated. Please use explicit type conversion.

But it is looks like warning is misleading, as of both value and 1 is of type Int so its summation also Int so you need to simply convert the result to Int64 and it is what you doing and that is perfectly ok.

let result: Int64 = Int64(value + 1)
like image 185
Nirav D Avatar answered Feb 09 '23 00:02

Nirav D


Just to answer this part: why its called Mixed-type addition

With the simplified example by Nirav D:

let value = 5
let result: Int64 = value + 1

You can Command-click on + and see the generated interface of Collection: (After Indexing has finished, of course.)

@available(swift, deprecated: 3.0, obsoleted: 4.0, message: "Mixed-type addition is deprecated. Please use explicit type conversion.")
public func +<T>(lhs: T.Stride, rhs: T) -> T where T : SignedInteger

So, in the code example above, the type of 1 is inferred as Int64, and as Int64.Stride == Int, the operation value + 1 matches the signature func +<T>(lhs: T.Stride, rhs: T) -> T where T : SignedInteger.

This deprecation is included in the revised version of SE-0104 Protocol-oriented integers, this part:

  • Standard Library no longer provides + and - operators for Strideable types.

    They were problematic, as one could have written mixed-type code like let x: Int64 = 42; x += (1 as Int), which would compile, but shouldn't. Besides, since the Stride of an unsigned type is signed, Standard Library had to implement a hack to make code like let x: UInt = 42; x += (1 as Int) ambiguous. These operators were only necessary because they made advancing collection indices convenient, which is no longer the case since the introduction of the new indexing model in Swift 3.

As you already have seen, you can avoid this warning in many ways.

like image 33
OOPer Avatar answered Feb 08 '23 23:02

OOPer