2015-09-01 6 views
2

Je portais quelques sous-classes ObjectiveCUIView personnalisées à Swift ce matin. Voulant le rendre plus "orienté objet", je suivais l'exemple de l'extension CGContext avec des méthodes. Par exemple.CGContext ET CGContextRef identique dans Swift? Comment cela marche-t-il?

extension CGContext { 
    func fillColor(color:UIColor) { 
     CGContextSetFillColorWithColor(self, color.CGColor) 
    } 
} 

Parce que je convertissait les messages objectif de style C (par exemple -(void) drawOutline: (CGContextRef) cr {...}) à ceux de style Swift sans payer à beaucoup d'attention (par exemple func drawOutline(cr:CGContextRef) {...}), je ne savais pas au début que je passais CGContextRef arguments, mais avait étendue CGContext (pas Ref). Mais ça a marché!

Ce qui était plus étrange, c'était quand j'ai changé ces CGContextRef à juste CGContext. Et ça a toujours marché. Pas seulement compilé, mais a couru et a dessiné correctement. Pour le plaisir, j'ai changé pour extension CGContextRef. Et pourtant, cela continue à fonctionner. C'est comme si Swift était assez intelligent pour les réduire à la même chose. Est-ce? Ou y a-t-il quelque chose de plus subtil/cool qui se passe ici?

+0

Obijective-C et Swift. Et vous avez ajouté le tag C juste pour le plaisir, je suppose. – Olaf

+0

Pas pour le plaisir. Peut-être par confusion mal orientée. Les parties de 'ObjectiveC 'mentionnées ici sont strictement' C' (rappelez-vous que ObjectiveC est un surensemble de C). 'CGContext' est une structure C opaque stricte. Et 'CGContextRef' est le typedef pour un pointeur vers le même. Je suppose que j'ai fait C, parce que c'est plus une question sur la façon dont Swift traduit les parties C que l'ObjectiveC. –

Répondre

3

Il n'y a rien de particulièrement magique ici. CGContextRef et CGContext sont juste des noms différents pour (presque) la même chose. Swift ne fait que brouiller le typedef pour vous.

<CoreGraphics/CGContext.h> 

typedef struct CGContext *CGContextRef; 

Voir aussi la section de guidage Using Swift with Cocoa and Objective-C sur le Core Foundation:

Lorsque les importations Swift base types Foundation, le compilateur remappe les noms de ces types. Le compilateur supprime Ref à la fin de chaque nom de type car toutes les classes Swift sont des types de référence, donc le suffixe est redondant.

Ils ont juste choisi de ne pas enlever la forme Ref du nom, je suppose que pour débutants qui sont anciens utilisés pour taper: D