0

It seems a class, which uses generics in swift, sometimes cannot properly determine object type.

Consider the following model structure:

class BaseModel: NSObject, Equatable, Printable {

    var id: String = ""

    override var description: String {
        return "id: \(id)"
    }

    override func isEqual(object: AnyObject?) -> Bool {
        if let object = object as? BaseModel {
            return object.id == id
        }
        else {
            return super.isEqual(object)
        }
    }
}

class Image: BaseModel {

    var image: UIImage!

}

I also have parsers, which should parse/serialize objects:

class AbstractParser<T: BaseModel where T: Equatable>: NSObject {

    func convertFromParseObject(object: NSObject) -> T {
        var entity = T()
        ......

        return updateEntityWithParseObject(object, entity: entity)
    }

    func updateEntityWithParseObject(object: NSObject, entity: T) -> T {
        fatalError("This method must be overridden")
    }

}


class ImageParser<T: Image>: AbstractParser<Image> {

    override func updateEntityWithParseObject(object: NSObject, entity: Image) -> Image {
        println("\(entity)")
        println("\(entity.id)")
        // The line below outputs BaseModel, shouldn't it be Image instead?
        println("\(NSStringFromClass(entity.classForCoder))")
        // EXC_BAD_ACCESS here:
        println("\(entity.image)")
        return entity
    }

}

The app crashes when I try to access entity.image.

For some reasons Swift thinks that entity object is BaseModel, not Image.

Playground file: https://drive.google.com/file/d/0B6agzpK_lR6JQUlhMFoxaGw1akU/view?usp=sharing

Andrey Gordeev
  • 30,606
  • 13
  • 135
  • 162

0 Answers0