2017-05-11 133 views
1

当我直接添加一个整数值:与另一整数变量“+”已被弃用:混合型除已弃用在夫特3.1

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

I(即1,2,3等)得到如下警告:

'+' 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

'1'是'Int',而不是'Int64'。 – JuicyFruit

+0

您的代码在我的Xcode 8.3.2中编译时没有警告。 –

+3

@JuicyFruit:不完全。 '1'是一个*整数字面*,可以是'Int'或'Int64'(或'Double'或...),取决于上下文。 –

回答

8

编辑:要生成与您的代码错误,应该像

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

现在你得到警告

“+”已过时:混合型除已被弃用。请使用显式类型转换。

但它看起来像是警告是误导性的,因为这两个value1的是Int型的,其总和也Int所以你需要简单地将结果转换为Int64,这是你在做什么,这是完美的好。

let result: Int64 = Int64(value + 1) 
+0

这并不能解释问题。*哪个*'+被弃用?*为什么*你必须明确地转换整数字面值?你用这个问题的代码重现问题? –

+0

@MartinR编辑答案指定问题不会在Xcode 8.3.2中生成 –

+0

@NiravD:为什么将+1添加为**混合类型添加**? – Poles

2

数据类型是不同的,这就是为什么它是否显示错误

你需要使两个可变和恒定为例如相同的数据类型

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

OK

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

给人以警示 '+' 已过时:混合型除已被弃用。请使用显式类型转换。

原因是,arr.count和我有不同的类型。这个警告是正确的。它有什么用整数字面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 
} 

我希望我们能在将来的发行版中编写所有这些代码片段时出现错误消息。

+0

现在。这就是我所说的。 – Poles

+2

@Poles:这意味着你最初的例子'let result = value + 1'是错误的。出现这个问题是因为结果被分配给一个“Int64”类型的变量,而这在你的问题中并不明显。 –

1

只是为了回答这个问题的一部分:为什么它被称为混合型除

通过简单的例子由Nirav d:

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

您可以在+命令点击并查看生成的接口为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 Protocol-oriented integers,这部分的修订版:

  • 标准库不再提供+和 - 运营商Strideable类型。

    他们是有问题的,因为人们可能已经写了混合类型的代码,如 让x:Int64 = 42; x + =(1为Int),它将编译,但不应该为 。此外,由于无符号类型的步长是有符号的,因此标准库必须实现一个代码,如let x:UInt = 42; x + =(1为Int)不明确。这些运营商只有必要的,因为他们做了前进的集合指数便利,这是毫无 较长时间,因为在 斯威夫特3.

引入新的索引模型的情况下,正如你已经看到的,你可以在很多方面避免这个警告。