2016-11-17 37 views
2

在Xcode中操場關閉的陣列做實驗,我收到此錯誤:斯威夫特:曖昧使用運營商的「*」

Playground execution failed: error: closures.playground:11:25: error: ambiguous use of operator '*' 
      {x in x * x}, 

我不明白了一個道理語法爲什麼這是不工作的,但它應該是

我的初始閉合是:

let f = {(x: Int) -> Int 
    in 
    return x + 42} 

我然後將如此限定的數組:

let closures = [f, 
      {(x:Int) -> Int in return x * 2}, 
      {x in return x - 8}, 
      {x in x * x}, //This line causes the error. 
      {$0 * 42}] 

每個封閉件的符合f的簽名,所以這是在Xcode錯誤?如果不是,發生了什麼?

要燕尾上,不應類型在一種情況下可以推斷,就像它是在所有其他情況下明確推斷?

編輯:雨燕2.2,這似乎很好地工作,但我使用Swift3。

+0

這似乎很好地工作,如果我們替換'X * x'與讓說,'X * 8'。或者與一些常數相乘。 –

+0

@RajanMaheshwari這是真的,但'x * x'遵循Swift語法規則,並且不起作用,這對我來說似乎有點兒麻煩。 – NonCreature0714

+0

我猜它是因爲編譯器無法找到x變量與自身相乘的類型,因爲它給出的數據類型爲。然而,乘以一些int常量使其成爲編譯器 –

回答

1

我有一個理論,如果你願意沿着這裏遵循:

使用您的f定義,下面一行導致不同的錯誤在雨燕2.2和雨燕3.0:

let closures = [f, { $0 * 4.5 },{$0 * 42}] 

注意的第二個元素是由雙相乘,使X的推斷類型爲Double一樣,所以關閉簽名不匹配。

在夫特2.2:「表達的類型是沒有更多的上下文模糊」

在夫特3.0:「異源收集字面只能被推斷爲‘[任何]’;添加顯式類型註釋如果這是故意的」

這似乎表明Swift 3.0編譯器可以識別不同封閉簽名的可能性,可能會將其作爲同質元素類型降級到Any

在您的例子:

let closures = [f, 
     {(x:Int) -> Int in return x * 2}, 
     {x in return x - 8}, 
     {x in x * x}, //This line causes the error. 
     {$0 * 42}] 

導致錯誤有x沒有明確的類型的線。 Swift 3.0允許x可能是某種其他類型的可能性,例如, Double,Float等,並且整個陣列可以被設計爲具有類型[Any]而不是[(Int)->Int]。因此,通過不聲明在此位置x任何明確的類型,或者closures作爲一個整體,它並不清楚該*功能的版本應該是選擇的編譯器。也許這些x都是雙打?花車?由於closures數組的類型不明確,並且x的類型不明確,因此編譯器無法確定應使用哪個版本的*以及操作數類型是什麼。

因此,您可以通過修復該錯誤使得陣列的類型明確,即:

let closures:[(Int)->Int] = [f, 
     {(x:Int) -> Int in return x * 2}, 
     {x in return x - 8}, 
     {x in x * x}, //No more error. 
     {$0 * 42}] 

或者,通過使x類型封明確的,即內:

let closures = [f, 
     {(x:Int) -> Int in return x * 2}, 
     {x in return x - 8}, 
     {(x:Int) in x * x}, //No more error. 
     {$0 * 42}] 

在其它封閉件,其它操作數的x相反足以用於編譯器推斷x類型,但在生成錯誤封閉,沒有什麼會決定性明確的類型。

此外,它似乎在Swift 2.2中起作用,因爲Swift 2.2不會將異構數組推斷爲[Any]類型,因此假定所有閉包都必須具有相同的類型。在Swift 3中,似乎允許一些模糊的可能性,這使得編譯器不太確定你的意圖。

至少這是我的理論:)

+0

這是一個很好的觀察,儘管在Swift2.2中,這些封閉按原樣工作。所以這就是我困惑的原因。 – NonCreature0714

+0

@ NonCreature0714我挖的更深一點,改變了我的答案,以反映_theory_,爲什麼它工作在斯威夫特2.2而不是3.0斯威夫特我 –

+0

會在明天早晨,當我在我的筆記本電腦好好看看! – NonCreature0714

0

我不知道它聽起來是否正確,但x變量沒有類型。它不是通過操作推斷出任何其他常數的類型。

它是< <錯誤類型>>。所以編譯器發現是ambiguos

enter image description here