Преобразование NSArray в Swift Array <T>
В CoreData я определил упорядоченное отношение to-many. Это соотношение определено в Swift следующим образом:
@NSManaged var types : NSMutableArray
Однако, чтобы использовать Swift лучше всего, я хочу использовать обычный массив Swift, например Type[]
. Однако CoreData заставляет меня использовать NS(Mutable)Array
. Как я могу напечатать/преобразовать NSArray
в Array<Type>[]
?
По-видимому, путаница возникает из-за ошибки:
let array = obj.types as T[] // Cannot convert expression type 'Node[]' to type '$T2'
Пока это принято редактором:
let array = obj.types as AnyObject[] as T[] // No complaint
Ответы
Ответ 1
В настоящее время я использую obj.types.allObjects as Type[]
, но это похоже на хак/обходной путь.
Затем пересмотреть свои чувства. То, что вы делаете, - это именно то, как вы делаете "type-cast/convert NSArray
to Array<Type>[]
."
NSArray всегда входит в Swift как содержащий AnyObject
(т.е. a Array<AnyObject>
, aka AnyObject[]
). Отбрасывая его на определенный тип, если вы знаете, что он содержит все один тип, зависит от вас, и как вы это делаете, именно то, что вы должны делать.
EDIT В Swift 2.0 и новых API-интерфейсах iOS 9 NSArray часто поступает правильно напечатанным, и никакого приведения не требуется.
РЕДАКТИРОВАТЬ 2 В Swift 3.0 NSArray, который неправильно напечатан, хотя и необычен, будет появляться как Any
вместо AnyObject
и все равно придется отбросить его до определенного тип.
Ответ 2
Перечислите их следующим образом:
for type in types.array {
// Do something
}
Или просто используйте свойство array
используемого NSOrderedSet
, например:
types.array
Ответ 3
Ниже приведен фрагмент кода из одного из моих проектов, который может помочь?
if let rawArray = rawData as? NSArray,
let castArray = rawArray as? Array< Dictionary< String, AnyObject > >
{
// etc...
}
Он работает, хотя я не уверен, что он будет считаться оптимальным.
Ответ 4
Вам нужно будет создать новый общий массив и вручную заполнить его следующим образом:
var result = Type[]()
for item : AnyObject in self {
// Keep only objC objects compatible with OutType
if let converted = bridgeFromObjectiveC(item, Type.self) {
result.append(converted)
}
}