CGRect de syntaxe, je n'ai pas vu avant
J'ai vu la syntaxe ci-dessous dans un exemple de code et je ne suis pas sûr que je comprends.
CGRect imageRect = (CGRect){.size = baseImage.size};
Est-ce simplement une manière de sténographie de l'initialisation d'un CGRect
équivalent à:
CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);
Est-il un quelconque avantage de cette syntaxe de côté, passant d'un peu moins de frappe?
- tout comme [NSNumber numberWithInt:1] est égal à @(1)
- 1) Oui 2) Non, l'un des inconvénients est l'irrégularité de la saisie semi-automatique si
Vous devez vous connecter pour publier un commentaire.
C'est C99 initialiseur de syntaxe. Vous pouvez l'utiliser avec toute la structure.
Le principal avantage de l'Objective-C, c'est qu'il vous donne un peu de très Objective-C comme la syntaxe, où les champs sont proches des valeurs plutôt que de tacite par de positionnement. (Cela ne veut pas dire que c'est volontairement similaire, ou que c'est le seul avantage. Mais il est gentil.)
C'est parfois légèrement plus de frappe, mais je l'utilise partout maintenant.
Considérer:
Pour comprendre cela, vous avez besoin de comprendre l'ordre des paramètres. Vous devez également être capable d'attraper les virgules facilement avec vos yeux. Dans ce cas, c'est assez facile, mais si les expressions sont plus compliquées que vous auriez probablement stocker dans une variable temporaire en premier.
Le C99 façon:
Il est plus long, mais c'est plus explicite. Il est aussi très facile à suivre ce qui est attribué à ce, peu importe combien de temps l'expression. C'est aussi plus comme un Objectif-C méthode. Après tout, si CGRect était une classe, il serait probablement ressembler à ceci:
Vous pouvez aussi faire des choses comme ça:
Ici, vous êtes la construction d'un rectangle à l'aide d'un
CGPoint
etCGSize
. Le compilateur comprend que.origin
s'attend à unCGPoint
, et.size
s'attend à unCGSize
. Vous avez fournies qu'. Tous les de la sauce.Le code équivalent serait
CGRectMake(myOrigin.x, myOrigin.y, size.width, size.height)
. En utilisantCGRectMake
vous n'êtes plus en exprimant la même sorte de sens pour le compilateur. Il ne peut pas vous empêcher d'affectation d'une partie de la taille de l'origine. Elle aussi ne vous empêchera pas de l'affectation de la largeur à la hauteur. Il n'a même pas vous donner une bonne idée de qui est le X et le Y, si vous avez utilisé les Api qui fournissent des coordonnées verticales d'abord, vous l'aurez tort.Vous pouvez affecter une partie à partir d'une structure et d'une partie de flotteurs ainsi:
La
CGRectMake
fonction antérieure C99. Je n'ai aucune preuve à cet effet, mais je pense que si C99 était venu d'abordCGRectMake
probablement n'existe pas du tout; c'est le genre de croustillant de la fonction que vous écrivez lorsque votre langue n'a pas de moyen direct pour effectuer l'initialisation. Mais maintenant, il n'.En gros, si vous l'utiliser pendant un certain temps, vous aurez probablement préfèrent C99 syntaxe. C'est plus explicite, plus souple, plus Objective-C et plus difficile à visser.
Malheureusement, comme de 4,6 Xcode ne sera pas saisie semi-automatique de la structure des noms de champ lorsque dans le C99 champ liste d'initialiseur.
CGRect a = (CGRect){ myOrigin, computedSize };
CGRectStandardize()
. Pas une grosse affaire pour la construction (depuis le CGRect n'est pas une entrée), ou même d'autres choses si vous les nourrissez parCGRectStandardize()
vous-même à un certain point.Ce n'est pas seulement la sténographie de la syntaxe, mais est également utile si vous souhaitez modifier uniquement la taille et non pas de l'origine de
CGRect
et vice versa.Par exemple : je veux modifier la taille et la position a une syntaxe compliquée et je ne veux pas le changer. Noramlly, je ne
Avec les autres éléments de la syntaxe, je le ferais
aussi, nous pouvons directement utiliser ajouter, soustraire et multiplier des méthodes
par exemple.
Espère que cette aide
il ressemble C99 /GCC style de l'initialisation http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html