'+'已经被弃用:在Swift 3.1中,混合类型的加法已经被弃用。

4
当我直接将整数值(即1、2、3等)与另一个整数变量相加时
let arr:Array = ["One","Two"]
var valueT:Int64 = 0
value = arr.count + 1 //in this line

我收到以下警告:

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

我用这个修复了警告

value = Int64(value + 1)

尽管它是固定的,但我想知道为什么它被称为混合类型加法,因为我没有使用++。还有没有更好的方法来修复Swift 3.1中的警告?
更新:
以下图像是警告的证明。我正在使用Xcode版本8.3(8E162)。

enter image description here

allROR在这里是一个数组。


1
1Int,不是 Int64 - JuicyFruit
3
并不完全正确。1 是一个整数字面量,根据上下文它可以是 IntInt64(或者 Double 等等)。请注意,这里只是翻译内容,不包括解释或其他额外的信息。 - Martin R
1
@Poles:在你的问题中,你声称有编译器警告。我无法重现这个问题,现在你又说你没有警告。那么你想要修复什么?如果没有问题,你要问什么“更好的方法”? - Martin R
2
@Poles 请将一个 [mcve] 复制并粘贴到你的问题中。正如其他人所指出的那样,你给出的第一个示例并没有重现警告。 - Hamish
1
@Poles 截图并不是很有帮助,因为其他人可能无法轻松地复制它,而且链接可能会随着时间的推移而失效。将MCVE复制粘贴到您的问题中,可以让我们轻松地重现问题,而不必对截图中的代码做出假设(例如,我们不知道allROR是如何声明的)。 - Hamish
显示剩余11条评论
4个回答

10

编辑: 要使用您的代码生成错误,应该像这样:

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

现在你收到了警告

 

'+'已被弃用:混合类型加法已弃用。 请使用显式类型转换。

但是看起来警告是误导的,因为value1都是Int类型,所以它们的求和也是Int,所以你只需要将结果转换为Int64,这正是你正在做的,并且这是完全可以的。

let result: Int64 = Int64(value + 1)

这并没有解释问题。哪个 + 被弃用了?为什么必须显式地转换整数字面量?- 你能用问题中的代码重现这个问题吗? - Martin R
@MartinR 编辑回答以指定问题不会在 Xcode 8.3.2 中产生。 - Nirav D
不推荐使用混合类型加法,这意味着您不能将 Int64Int 相加,对吗? - Poles
@Poles 这些代码行 `var value:Int64 = 5value = value + 1 //在这一行` 没有产生任何警告,我已经向您展示了链接,请再次检查 https://swift.sandbox.bluemix.net/#/repl/59140e5a5ec5ef2986a89c63 - Nirav D
好的。明白了。 - Poles
显示剩余4条评论

3

仅回答这一部分:为什么它被称为混合类型加法

使用 Nirav D 提供的简化示例:

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

您可以在 + 上执行 Command-click,查看 Collection 的生成接口: (当然,在完成索引后。)
@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

因此,在上面的代码示例中,1的类型被推断为Int64,由于Int64.Stride == Int,操作value + 1与签名func +<T>(lhs: T.Stride, rhs: T) -> T where T : SignedInteger相匹配。

这个弃用包含在修订版的SE-0104 面向协议的整数中的这一部分中:

标准库不再为Strideable类型提供+和-运算符。它们存在问题,因为可以编写混合类型代码,例如let x: Int64 = 42; x += (1 as Int),虽然可以编译,但不应该这样做。此外,由于无符号类型的步幅是有符号的,标准库必须实现一个hack来使类似let x: UInt = 42; x += (1 as Int)的代码模糊不清。这些运算符之所以必要,是因为它们方便了集合索引的推进,但自Swift 3引入新的索引模型以来,情况已经不再如此。正如您已经看到的那样,您可以用许多方法避免这个警告。

2

数据类型不同,因此会显示错误。

您需要将变量和常量的数据类型设置为相同。

例如:

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

1

好的

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

警告:'+'已过时:混合类型加法已过时。请使用显式类型转换。

原因是,arr.count和i具有不同的类型。这个警告是正确的。它与整数字面值1无关

此代码片段也会给你相同的警告

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

这段代码看起来非常相似,但是它无法编译。
var arr = [String]()
var i: Int64 = 0
if arr.count == 0 {
    i = 1
} else {
    let tmp = arr.count + 1
    i = tmp
}

我希望在未来的版本中,当我们组合所有这些片段时能够收到错误消息。

现在。这就是我所说的。 - Poles
2
@Poles:这意味着你最初的例子 let result = value + 1 是错误的。问题出在结果被赋值给了一个 Int64 类型的变量,而这一点在你的问题中并不明显。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接