Swift: CGRect, CGSize & CGPoint

Vous le faites (probablement) mal

Andyy Hope
Andyy Hope
Andyy Hope

Suivez
2 février 2016 · 4 min de lecture

Cela fait environ huit mois que j’ai décidé de sauter complètement dans le trou de ver rapide. Au cours de ces mois, j’ai lentement appris à arrêter d’écrire des modèles de code de style Objective-C avec une syntaxe rapide, et j’ai commencé à tirer parti du nouveau langage.

Mais une chose que j’ai récemment reprise est que j’utilise toujours une syntaxe laide de type non-Swift avec toutes mes structures CGGeometry.

CGRect, CGSize, CGPoint

Syntaxe C. Un mouton en tenue de loup

J’ai le sentiment que beaucoup de développeurs rapides vont être coupables de cela. Levez la main si vous avez utilisé l’un de ces éléments dans votre code:

let rect = CGRectMake(0, 0, 100, 100)let point = CGPointMake(0, 0)let size = CGSizeMake(100, 100)

Mise à jour : Depuis Swift 3, ces fonctions ont été supprimées.

Oui, je le pensais. Mais ne vous inquiétez pas, il n’y a pas de quoi avoir honte … encore.

Ce qui ne va pas avec cela, c’est qu’il casse la convention de codage de Swift, cela fonctionnera toujours, mais cela ressemble beaucoup plus à quelque chose qui, s’il appartient à Objective-C ou même, oserais-je le dire, à Java. * frissons *

Pour un développeur iOS ou OSX chevronné, d’un bref coup d’œil, ils pourraient facilement vous dire ce que fait ce code. Ils n’ont pas besoin d’étiquettes d’arguments sur les structures CGGeometry car tout le monde connaît ces arguments et leur séquence par cœur. Sauf qu’ils ne le font pas.

Une grande partie de ce qu’est Swift est d’être amical avec les nouveaux arrivants en langue ainsi qu’avec les débutants en programmation complète. S’ils devaient regarder ce code, ils n’auraient aucune idée de ce que représentent ces nombres. Alors faisons tous vœu d’être de bons citoyens Swift et commençons à utiliser les versions Swift:

let rect = CGRect(x: 0, y: 0, width: 100, height: 100)let size = CGSize(width: 100, height: 100)let point = CGPoint(x: 0, y: 0)

Pour un peu plus de syntaxe, la verbosité de notre code est tout à fait compréhensible à première vue. En outre, un avantage supplémentaire de l’utilisation de l’initialiseur de structure CGGeometry est que maintenant nous ne sommes pas seulement limités à utiliser CGFloat comme arguments, nous pouvons également passer Int et Double!

Zero

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Mise à jour : Depuis Swift 3, ces fonctions ont été supprimées.

Pendant que nous y sommes, vous les utilisez probablement encore, amirite? lel.

Nous devrions également les mettre à jour pour utiliser la syntaxe plus récente et plus rapide. Mais ne vous inquiétez pas, la syntaxe n’est qu’un caractère supplémentaire plus long. Pouvez-vous deviner ce que c’est?

let rect = CGRect.zerolet size = CGSize.zerolet point = CGPoint.zero

Une autre chose pour vous aider avec cela est que le surligneur de syntaxe de Xcode mettra en évidence, en fonction de votre palette de couleurs, le .zero, ce qui le rendra un peu plus léger sur votre charge cognitive.

Récupération de valeur

CGRect frame = CGRectMake(0, 0, 100, 100)CGFloat width = CGRectGetWidth(frame)CGFloat height = CGRectGetHeight(frame)CGFloat maxX = CGRectGetMaxX(frame)CGFloat maxY = CGRectGetMaxY(frame)

Mise à jour : À partir de Swift 3, ces fonctions ont été supprimées.

Si vous étiez ou êtes toujours un bon citoyen Objective-C, vous auriez utilisé ces récupérateurs de valeurs lorsque vous vouliez une valeur spécifique du rect. Mais attendez une seconde, pourquoi ne pas accéder directement aux valeurs?

CGFloat width = frame.size.widthCGFloat height = frame.size.height

Pour cette raison, vos applications doivent éviter de lire et d’écrire directement les données stockées dans la structure de données CGRect. Utilisez plutôt les fonctions décrites ici pour manipuler les rectangles et récupérer leurs caractéristiques.

— Documentation de référence Apple, CGGeometry

Il y a probablement encore beaucoup d’entre vous qui n’ont pas pris la peine de telles formalités, mais c’est ok. Swift nous a soulagés d’une API aussi simple et a plutôt fourni de simples variables de notation par points.

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let width = frame.widthlet height = frame.heightlet maxX = frame.maxXlet maxY = frame.maxY

Il y a beaucoup d’autres exemples de ces subtilités disponibles dans les terrains de jeux Swift que j’ai fournis pour compléter ce post. Le lien sera au bas de la page.

Mutabilité

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let view = UIView(frame: frame)view.frame.origin.x += 10

Non seulement vous pouvez modifier les valeurs individuelles du cadre d’une vue, mais vous pouvez également remplacer complètement des sous-structures entières. Voici:

let view = UIView(frame: .zero)view.frame.size = CGSize(width: 10, height: 10)view.frame.origin = CGPoint(x: 10, y: 10)

Cette petite fonctionnalité suffit à elle seule pour arrêter d’utiliser Objective-C. Mutabilité sur CGRect s sans avoir à en créer une nouvelle entièrement et à réinitialiser la valeur. Il y a seulement moins de deux ans, en tant que développeurs Objective-C, nous avons été obligés d’écrire du code de modification de trame comme celui-ci:

CGRect frame = CGRectMake(0, 0, 100, 100);UIView *view = initWithFrame: frame];CGRect newFrame = view.frame;newFrame.size.width = view.frame.origin.x + 10;view.frame = newFrame;

Je ne sais pas pour vous, mais écrire cela m’a vraiment stressé. Créer une structure newFrame à partir de la trame view, la modifier, puis réinitialiser à nouveau la propriété frame sur la view. Non merci, plus jamais, plus jamais s’il vous plait.

N’oubliez pas

Il existe également quelques autres constructions dans UIKit pour lesquelles ces modifications sont applicables à :

UIEdgeInsets var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
edgeInsets.top += 10UIOffsetvar offset = UIOffset(horizontal: 10, vertical: 10)
offset.vertical += 10

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.