2015-06-02 52 views
3

我有一個簡單函數,返回的元組正在初始化兩個元組的陣列失敗

func findNodeNeighbors(node: Node) -> [(node: Node, distance: Double)] { 
    var neighbors = [(node: Node, distance: Double)]() 
    var nodeLinks = linksWith(node) 
    for link in nodeLinks { 
     neighbors.append((node: link.otherNodeLinkedWith(node), distance: link.length)) 
    } 
    return neighbors 
} 

的陣列但是這原來是在功能體的第一行的錯誤Invalid use of() to call a clue of non-function type

如果相反,我明確聲明neighbors的類型,一切都很好。

var neighbors: [(node: Node, distance: Double)] = [] 

怎麼來的?

我讀過,它是首選聲明數組通過初始化他們,並允許隱式類型推斷。

+0

是否'追加((...,...))'爲你工作?它不適合我,Apple會將它列爲已知的錯誤。 –

+0

據我所知,'append()'在這個實例中起作用。我檢查了數組的內容,它有我放在那裏的成員。 @StevenVanImpe –

回答

4

相當肯定這是斯威夫特的語法分析器中的錯誤,特別是與[Type]糖結合命名元組做。

var neighbors = Array<(node: Node, distance: Double)>()(應該與[(node: Node, distance: Double)]()相同)工作正常。

編輯:看起來像字典相當於有同樣的問題

正常工作:

var d = Dictionary<Int,(x: Int, y: Int)>() 

猛擊:

var d = [Int:(x: Int, y: Int)]() 
+1

我擔心這是!不能等待WWDC發生得更快......因爲Swift解析器的當前狀態仍然遠遠落後於Objc的狀態。 –

+1

莫'語言特徵,莫'問題 –

0

你應該使用默認值初始化數組:

var neighbors = [(node: node, distance: 0.0)] 
+0

如果我想要一個空數組作爲初始值,該怎麼辦? –

+0

好,那麼@Airspeed的答案是最好的方法去 –

+0

確實!感謝您的努力:) –

2

,如果我想要一個空數組作爲初始什麼值?

我不是100%肯定的 - 但我認爲另一種方式可以快速解決這個問題,目前是通過使用typealias來聲明元組。

如:

typealias Test = (Node, Double) 

func findNodeNeighbors(node: Node) -> [Test] { 
    var neighbors = [Test]() 
    //etc 
} 
+0

它看起來很優雅(不完美,但...):) –