2016-12-09 51 views
0

我試圖用Swift結構體填充NSOutlineView作爲它的項目。除了row(forItem:)方法,它總是返回-1,這是有效的。 我已經確定我的結構符合Equatable,並且我實現了isEqual函數。仍然NSOutlineView無法找到任何項目的行。在NSOutlineView中使用Swift結構

如果我將我的結構轉換爲類(而不是派生自NSObject),它都可以工作。即使不符合Equatable或實施任何isEqual函數。

我認爲在Swift中的類和結構基本上是相同的,除了一個是引用類型,另一個是值類型。

我需要實現如何使用Swift結構作爲NSOutlineView中的項目?

回答

0

有人在蘋果開發者論壇上發佈a similar question

NSOutlineView在標識項目時不使用Equatable,它使用指向該項目的引用指針。在Swift中,結構總是按值傳遞(而不是通過引用傳遞),因此大綱視圖永遠不會識別出您傳遞的項目是相同的。將你的結構切換到一個類可以解決這個問題,因爲Swift使用類傳遞引用。

不幸的是,沒有辦法使用Structs作爲項目來使用NSOutlineView,您將需要使用一個類。

閱讀this answer瞭解更多關於Swift如何使用pass by reference和value pass的更多細節。

-1

您可以通過查看所有行並返回相等的索引來覆蓋子類中的方法row(forItem item: Any?)