2017-05-11 175 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.

引入新的索引模型的情況下,正如你已經看到的,你可以在很多方面避免這個警告。