Création d'instances de classe

RocouRocou Membre

Bonjour,

Normalement avec une classe du style:

class Rectangle  { 
    // largeur
    var width: Int = 5
    // hauteur
    var height: Int = 10

    } 
}

Il suffit de créer une instance de la classe afin créer un rectangle:

var monRectangle = Rectangle()

Cependant avec la classe ci-dessous, rien ne se passe au moment de l'instanciation

class DrawOnView: NSView {
       var debutX: CGFloat = 20.0
        var debutY: CGFloat = 100.0
        var finX: CGFloat = 0.0
        var finY: CGFloat = 40.0

     override func draw(_ rect: CGRect) {
        let path = NSBezierPath()
        path.move(to: CGPoint(x: debutX, y: debutY))
        path.line(to: CGPoint(x: finX, y: finY))
        path.stroke()
        print("passage")
      }
}

 //Création de l'instance
 var dessine = DrawOnView()

Rien ne se passe, le mot "passage" n'est pas affiché.
Par ailleurs, si je veux récupérer une propriété, j'ai une erreur à la compilation:
let laValeur : dessine.debutX affiche l'erreur Cannot find type 'dessine' in scope

Mots clés:

Réponses

  • PyrohPyroh Membre

    Pour l'instanciation ça utilise une function init. Ici tu t'attends à ce que la fonction draw soit appelée pour instancier une nouvelle DrawOnView. Ça n'arrivera pas.

    Pour ce qui est de l'erreur Cannot find type 'dessine' in scope c'est assez simple. D'après le code tu dis au compilateur que la variable laValeur est de type dessine.debutX. let laValeur = dessine.debutX a plus de chances de fonctionner 😉

    Après, si je fais une petite rétrospective des questions que tu as pu poser ces derniers mois, je pense qu'il serait peut-être bon de reprendre les bases. Du langage Swift mais aussi de Cocoa et des concepts de programmation moderne. Je te conseille Hacking With Swift qui est super complet, que ce soit les articles ou les livres. J'ai pas de resource en Français malheureusement.
    Mais ne prends pas ça comme un reproche, j'ai juste l'impression que tu souffre à assembler les morceaux de ton application et ça ne doit pas être super agréable. On sera toujours là pour te filer un coup de main.

  • LarmeLarme Membre

    draw(_:) ne sera appelée que lorsque tu en auras réellement besoin, ie lorsque la vue aura besoin d'être affichée.
    Ce n'est pas une méthode d'initialization, donc elle n'est pas appelée à l'init.

  • RocouRocou Membre

    @Pyroh a dit :
    Pour l'instanciation ça utilise une function init. Ici tu t'attends à ce que la fonction draw soit appelée pour instancier une nouvelle DrawOnView. Ça n'arrivera pas.

    J'aimerais en effet, que draw soit à nouveau appelée.

    Pour ce qui est de l'erreur Cannot find type 'dessine' in scope c'est assez simple. D'après le code tu dis au compilateur que la variable laValeur est de type dessine.debutX. let laValeur = dessine.debutX a plus de chances de fonctionner 😉

    Ha oui, mince! :D

    Après, si je fais une petite rétrospective des questions que tu as pu poser ces derniers mois, je pense qu'il serait peut-être bon de reprendre les bases. Du langage Swift mais aussi de Cocoa et des concepts de programmation moderne. Je te conseille Hacking With Swift qui est super complet, que ce soit les articles ou les livres. J'ai pas de resource en Français malheureusement.
    Mais ne prends pas ça comme un reproche, j'ai juste l'impression que tu souffre à assembler les morceaux de ton application et ça ne doit pas être super agréable. On sera toujours là pour te filer un coup de main.

    Oui, c'est dur, en 10 ans, j'ai oublié pas mal de choses, Xcode a beaucoup évolué et Swift/MacOS est plus complexe qu'il n'en a l'air au premier abord.
    J'ai sans doute voulu aller trop vite. Merci pour la référence, je ne suis pas de tout vexé, rassure toi.

  • devulderdevulder Membre

    Autre souci avec ta classe, c'est l'appel de construction

    var dessine = DrawOnView()
    Si tu n'appelle pas la méthode initWithFrame:
    alors la taille de ta vue est égal à zéro et tu verra rien à l'écran
    print(dessine.frame, dessine.bounds)

    Il faut alors mettre une taille manuellement
    dessine.frame = NSMakeRect(100,100,200,240)

  • RocouRocou Membre

    @Pyroh a dit : 😉

    Je te conseille Hacking With Swift qui est super complet, que ce soit les articles ou les livres.

    Merci @Pyroh , Paul Hudson est vraiment un bon pédagogue et il maitrise le sujet à la perfection!

Connectez-vous ou Inscrivez-vous pour répondre.