Création d'instances de classe
Rocou
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:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pour l'instanciation ça utilise une function
init
. Ici tu t'attends à ce que la fonctiondraw
soit appelée pour instancier une nouvelleDrawOnView
. Ç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 variablelaValeur
est de typedessine.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.
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.
J'aimerais en effet, que draw soit à nouveau appelée.
Ha oui, mince!
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.
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)
Merci @Pyroh , Paul Hudson est vraiment un bon pédagogue et il maitrise le sujet à la perfection!