Comment implémenter le constructeur de copie dans la sous-classe Swift?

J'ai l'exemple suivant, dans une Swift aire de jeux, dans une tentative de mettre en œuvre un constructeur de copie rapide:

class Shape : NSObject {
    var color : String

    override init() {
        color = "Red"
    }

    init(copyFrom: Shape) {
        color = copyFrom.color
    }
}

class Square : Shape {
    var length : Double

    override init() {
        super.init()
        length = 10.0
    }

    init(copyFrom: Square) { /* Compilation error here! */
        super.init(copyFrom: copyFrom)
        length = copyFrom.length
    }
}

let s : Square = Square()      //{{color "Red"} length 10.0}

let copy = Square(copyFrom: s) //{{color "Red"} length 10.0}

s.color = "Blue"               //{{color "Blue"} length 10.0}
s                              //{{color "Blue"} length 10.0}
copy                           // {{color "Red"} length 10.0}

Le problème, c'est que ce n'est pas réellement de la compilation dans sa forme actuelle. Sur le init(copyFrom: Square) méthode dans le Square sous-classe, cette erreur est signalée:

Overriding method with selector 'initWithCopyFrom:' has incompatible type '(Square) -> Square'

Cette question aurait du sens si ce n'était pas un constructeurcomme s'il s'agissait d'une funcvous pourriez potentiellement passer dans un type qui est prévu dans la super-classe, mais qui a été remplacée dans la sous-classe pour être plus restrictif:

let mySquare : Shape = Square()  //Note the var is a SHAPE
mySquare.someShapeMethod("Test") // If Square overrides someShapeMethod() to expect Int, compiler errors out to protect us here.

Mais le fait que c'est un constructeur m'amène à croire que je devrais être en mesure de remplacer et d'en fournir une autre signature de la méthode, car il est absolument connu au moment de la compilation que le type de l'objet.

Ce problème disparaît si je modifier Shape de ne plus étendre NSObject. Toutefois, en raison de l'inclusion avec un code Objective-C, il doit étendre NSObject.

Comment puis-je mettre à jour mon constructeur de copie pour permettre une Shape de savoir c'est de la copie à partir d'un Shapeet de permettre une Square de savoir c'est de la copie à partir d'un Square?

source d'informationauteur Craig Otis