Элемент NSArray не соответствует типу элемента Swift Array

У меня есть объект Core Data (Order), у которого есть метод для возврата массива другого объекта Core Data (OrderWaypoint).

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 } 

Но когда я пробую то же самое в своей тестовой цели

фатальная ошибка: элемент NSArray не соответствует типу элемента Swift Array

Я попытался отличить значения, но не могу заставить его работать. Любые идеи, почему это работает в главной цели, но не в тестовой цели?

РЕДАКТИРОВАТЬ

Ну, ломая его дальше, проблема особенно происходит, когда я пытаюсь получить элемент из массива.

 var orderedList: [OrderWaypoint] = order.getOrderedWaypoints() for var i = 0; i < orderedList.count; i++ { var waypoint = orderedList[i] // do something } 

4 Solutions collect form web for “Элемент NSArray не соответствует типу элемента Swift Array”

Вы can sortedArrayUsingDescriptors поскольку sortedArrayUsingDescriptors возвращает NSArray, и вам нужно скопировать все элементы из этого массива в массив Swift Typed.

 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 } 

Вместо того, чтобы делать все эти сортировки в памяти, я, как правило, получаю эти вспомогательные методы, которые извлекают связанные данные для получения данных непосредственно из базы данных, например:

 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) } 

Дело в том, что я вообще хочу, чтобы база данных выполняла грубую работу по сортировке моих данных, а не по коду. И это не намного больше кода.

Наиболее вероятная причина в том, что ошибка верна: по крайней мере один из элементов в self.waypoints самом деле не является OrderWaypoint . Возможно, у вас есть другой тип, который отвечает на одни и те же сообщения. У вас может быть суперкласс класса OrderWaypoint (используете ли вы mogenerator, возможно, какие-либо из них фактически _OrderWaypoint объектами _OrderWaypoint ?) Вы перескакиваете объекты, которые они лгут об их истинном типе? KVO может это сделать.

Тот факт, что это не удается в тестовой цели, повышает вероятность того, что вы издеваетесь над этими объектами. Это возможно?

Я бы начал внимательно изучать содержимое self.waypoints чтобы убедиться, что оно действительно содержит то, что вы думаете.

Причина, по которой это происходит только в вашей тестовой цели, заключается в том, что это отдельный модуль из вашего основного приложения, поэтому вы получаете разные версии вашего класса OrderWaypoint в каждом модуле, который Swift считает разными классами: App.OrderWaypoint и AppTest.OrderWaypoint .

Я работаю над решением этого в моем собственном проекте, и я обновлю, когда у меня будет хорошее решение 🙂

Обновление: для всех проектов Swift я считаю, что решение состоит в том, чтобы удалить ваши тестовые файлы без тестирования из тестовой цели и добавить @testable import YourAppModuleName в ваши тесты Swift. По-видимому, это современный подход и, вероятно, должен быть сделан в любом случае. (Хотя, если ваше приложение все Swift, у вас, вероятно, не будет этой проблемы.)

Однако это не сработало для меня, потому что у меня есть тесты, написанные в Objective-C, которые нуждаются в доступе к моим классам Swift, и мне не удалось найти эквивалент Objective-C для импорта модуля Swift в целевой программе приложения.

Мое решение состояло в том, чтобы переписать код проблемы в Objective-C, где он не выполняет такую ​​строгую проверку типов. В моем случае это было легко, потому что проблемные функции были в расширении класса, который изначально был объявлен в Objective-C, поэтому их легко переместить.

Обновление 2: немного упрощенное, но более простое решение – удалить файлы Swift приложения из целевой задачи и затем установить пути поиска заголовка в целевой тестовой точке, чтобы DerivedSources папку DerivedSources из целевой DerivedSources приложения и включить App-Swift.h в AppTest-Swift.h Objective-C, которые ему нужны, вместо файла AppTest-Swift.h который больше не имеет классов Swift приложения, потому что вы просто удалили их из тестовой цели.

  • Удалить цвет фона в UITableViewAccessory
  • Добавьте UIToolBar ко всем клавиатурам (быстро)
  • Проблемы с концентратором Pubnub + Wink и датчиками
  • Опубликовать изображение / видео в twitter в swift
  • Как добавить жестом салфетки к узлу в spritekit
  • Как загрузить несколько изображений в multipart с помощью Alamofire?
  • Swift - удалить заголовок из backBarButtonItem, но сохранить стрелку
  • Обнаружение столкновения двух объектов в Swift
  • UITableView внутри UITableView?
  • Невозможно создать подкласс NSManagedObject
  • Как рисовать градиент с помощью SKKeyframeSequence: согласно документам Apple
  • Interesting Posts

    Как изменить пространство между UIBarButtonItems в UINavigationBar?

    Как вы можете создать пользовательский объект в палитре объектов Interface Builder?

    Диаграммы классов UML для Xcode (быстрое программирование)

    Как всегда прокручивать UIScrollView?

    ZLib в iPhone не может распаковать данные

    Сдвиг UIViewController для pop – как в приложении Readability

    Как загрузить зависимости Podspec для локальной разработки

    как сделать мой appDelegate coredata поддерживает ios 9, я использую xCode 8

    app зависает на executeFetchRequest

    setNeedsDisplay и subviews

    Phonegap Сборка параметра качества iOS camera.getPicture () не работает

    UIActionSheet изменяет значения UIScrollView

    Код зоны телефона для имени города на iOS

    Включение объектов зомби в Xcode 7 GM приводит к тому, что класс _NSZombie_BSXPCMessage реализован в обоих случаях. а также?

    share Расширение IOS 8: Как удалить часть собственной активности в категории акций?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.