Элемент 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 приложения, потому что вы просто удалили их из тестовой цели.

  • Как бы вы переделали UIControl? Как он вписывается в цепочку ответчиков?
  • XCode 6.3 добавляет поля в tableviewcell
  • Изменение цвета кнопки «Назад» на панели навигации
  • Приложение iPhone только отклонено для того, чтобы не работать на iPad
  • Как получить текущую позицию x и y, чтобы я мог использовать GCRectMake?
  • iOS swift 0 ключ / значение пары для непустого словаря
  • Как я могу написать это перечисление typedef из объектного c в swift?
  • Класс «ViewController» не имеет ошибки инициализатора: xcode Beta 4
  • Расширить массив для соответствия протоколу, если элемент соответствует данному протоколу
  • Не удается импортировать UIKit
  • Как добавить цифровую и десятичную клавиатуру в свою пользовательскую клавиатуру на iOS8?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.