2014-09-19 124 views
4

我有一個核心數據對象(Order),它有一個返回另一個Core Data對象(OrderWaypoint)數組的方法。NSArray元素無法匹配Swift數組元素類型

func getOrderedWaypoints() -> [OrderWaypoint] { 
    let nameDescriptor = NSSortDescriptor(key: "stop_number", ascending: true) 
    let sorted: [OrderWaypoint] = self.waypoints.sortedArrayUsingDescriptors([nameDescriptor]) as [OrderWaypoint] 
    return sorted 
} 

一切正常,使用下面的循環

for waypoint in order.getOrderedWaypoints() { 
    // do something 
} 

當主目標如期但是,當我試圖在我的測試目標完全一樣的事情

fatal error: NSArray element failed to match the Swift Array Element type

我試着鑄造的價值,但似乎無法得到它的工作。任何想法爲什麼它在主要目標而不是測試目標中起作用?

編輯

嗯打破它進一步下降,這個問題特別是當我試圖讓一個項目從數組中發生的事情。

var orderedList: [OrderWaypoint] = order.getOrderedWaypoints() 

for var i = 0; i < orderedList.count; i++ { 
    var waypoint = orderedList[i] 
    // do something 
} 
+0

創建NSArray並將其傳遞給Swift代碼的代碼在哪裏? – Mark 2014-09-19 18:15:01

+0

我用方法定義更新了原始文章。 order.waypoints是核心數據中的NSSet。我應用排序描述符來獲取NSArray並向下轉換爲[OrderWaypoint]。 – 2014-09-19 18:19:18

+2

你有沒有得到這個工作?我遇到了類似的情況 - 使用核心數據的子類應該可以工作,但是我們遇到了這個問題。 – 2014-10-16 01:48:20

回答

1

你不能強制轉換爲sortedArrayUsingDescriptors返回一個NSArray的,你需要從陣列中的所有元素複製到斯威夫特類型數組。

func getOrderedWaypoints() -> [OrderWaypoint] { 
    let nameDescriptor = NSSortDescriptor(key: "stop_number", ascending: true) 
    let sorted = [OrderWaypoint]() 
    for elem in self.waypoints.sortedArrayUsingDescriptors([nameDescriptor]) { 
     sorted.append(elem) 
    } 
    return sorted 
} 
0

而不是做在內存中所有的排序,我通常有獲取相關數據直接從像數據庫中獲取數據,這些輔助方法:

var orderedWayPoints: [WayPoint] { 
    let request = NSFetchRequest(entityName: "Waypoint") 
    request.sortDescriptors = NSSortDescriptor(key: "stop_number", ascending: true) 
    request.predicate = NSPredicate(format: "parent = %@", self) 

    return try! managedObjectContext.executeFetchRequest(request) 
} 

的一點是,我一般希望數據庫來完成排序我的數據而不是代碼的繁瑣工作。而且代碼也不多。

0

最可能的原因是錯誤是真的:self.waypoints中至少有一個元素實際上不是OrderWaypoint。您可能還有其他類型的內容響應相同的消息。你可能有一個超類OrderWaypoint(你是否使用mogenerator,或許?這些實際上是_OrderWaypoint對象中的任何一個?)你是否在使用它們來描述它們的真實類型? KVO可以做到這一點。

事實上,這在測試目標中失敗會提高你嘲笑這些對象的可能性。那可能嗎?

我會從仔細檢查self.waypoints的內容開始,以確定它實際上是否包含您的想法。

0

它只會發生在您的測試目標的原因是,它是從主應用程序不同的模塊,這樣就可以獲得不同版本的OrderWaypoint類中的每個模塊中,斯威夫特認爲是不同類別的:App.OrderWaypointAppTest.OrderWaypoint

我的工作在我自己的項目解決這一點,當我有一個很好的解決方案:)

更新我會更新:對於全斯威夫特的項目,我認爲解決方法是刪除測試目標中的非測試.swift文件,並將@testable import YourAppModuleName添加到您的Swift測試中。顯然這是現代化的方法,無論如何應該可以完成。 (儘管如果你的應用全是Swift,你可能不會有這個問題。)

這對我來說並不適用,因爲我有用Objective-C編寫的需要訪問我的Swift類的測試,而且在導入應用目標的Swift模塊時找不到Objective-C等效項。

我的解決方案是重寫Objective-C中的問題代碼,它不會執行如此嚴格的類型檢查。就我而言,這很容易,因爲有問題的函數是最初在Objective-C中聲明的類的擴展,所以很容易將它們移動。

更新2:稍微祕密的,但更簡單的解決方案是從所述測試對象中刪除該應用夫特文件,然後設置頭搜索路徑在測試目標從應用目標指向DerivedSources夾並在需要它的Objective-C測試中包含App-Swift.h文件,而不是AppTest-Swift.h文件,該文件不再具有應用程序Swift類,因爲您只是將它們從測試目標中刪除。

+0

你肯定在測試目標中不應該有源文件,但是你不應該在jimmy頭部搜索路徑中。特別指出派生是荒謬的。 – Rob 2016-07-18 16:06:35

+1

那麼我打開替代品。 Objective-C源文件如何從另一個目標訪問Swift類的定義? – Uncommon 2016-07-18 19:54:46

+0

這是所有[這裏]描述(https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html)。很簡單。對不起,如果我聽起來像一個工具,我有我的源文件多年的測試目標,並最終打破了它自己。 – Rob 2016-07-18 21:26:57

相關問題