With swift 1.2, I can no longer retrieve an array of poiter with parse subclass and downcasting it with another parse subclass.
I always found the error:
fatal error: NSArray element failed to match the Swift Array Element type
Do you have an idea or it may come?
The code:
import Foundation
class ShotModel : PFObject, PFSubclassing {
/**
* MARK: Properties
*/
@NSManaged var name: String
@NSManaged var pics: [PicModel]
override class func initialize() {
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken) {
self.registerSubclass()
}
}
class func parseClassName() -> String! {
return "Shot"
}
}
import Foundation
class PicModel : PFObject, PFSubclassing {
/**
* MARK: Properties
*/
@NSManaged var name: String
override class func initialize() {
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken) {
self.registerSubclass()
}
}
class func parseClassName() -> String! {
return "Pic"
}
}
// this cause error
var shot: ShotModel = // a shot model get with fetchInBackgroundWithBlock
shot.pics // fatal error: NSArray element failed to match the Swift Array Element type
Thanks for your time
The problem come from this part of code :
override class func initialize() {
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken) {
self.registerSubclass()
}
}
registerSubclass()
for ShotModel is called before registerSubclass()
for PicModel.
I've resolved with this in AppDelegate :
PicModel.registerSubclass()
ShotModel.registerSubclass()
The problem lies to the fact that ShotModel is registered as a subclass before PicModel. To invert that we can call PicModel initialisation the initialisation of ShotModel.
This way we keep the suggested solution by parse and make sure that classes are registered in the correct order.
class ShotModel : PFObject, PFSubclassing {
/**
* MARK: Properties
*/
@NSManaged var name: String
@NSManaged var pics: [PicModel]
override class func initialize() {
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken) {
PicModel.initialize()
self.registerSubclass()
}
}
Somehow I had to also init the object after registering in AppDelegate
:
PicModel.registerSubclass()
PicModel()
ShotModel.registerSubclass()
ShotModel()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With