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

元气小坏坏 提交于 2019-12-10 17:38:44

问题


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

allROR is an array here.


回答1:


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)



回答2:


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.




回答3:


Data type is different that is why it is showing an error

you need to make both variable and constant of same data type

for e.g.

let result = value + Int64(1) //in this line



回答4:


OK

var arr = [String]()
var i: Int64 = 0
if arr.count == 0 {
    i = 1
} else {
    i = arr.count + 1
}

gives as a warning '+' is deprecated: Mixed-type addition is deprecated. Please use explicit type conversion.

The reason is, that arr.count and i has different types. And this warning is right. It has nothing with the integer literal 1

this snippet gives you the warning too

var arr = [String]()
var i: Int64 = 0
if arr.count == 0 {
    i = 1
} else {
    i = 1
    i += arr.count // here is the warning now
}

this will not compile, even though it looks very similar

var arr = [String]()
var i: Int64 = 0
if arr.count == 0 {
    i = 1
} else {
    let tmp = arr.count + 1
    i = tmp
}

I hope we get an error message when we compose all of these snippets in the future release.



来源:https://stackoverflow.com/questions/43907984/is-deprecated-mixed-type-addition-is-deprecated-in-swift-3-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!