Swift: CGRect, CGSize & CGPoint

sei (probabilmente) sbagliato

Andyy Speranza
Andyy Speranza

Seguire

Feb 2, 2016 · 4 min leggere

e ‘ stato circa un solido otto mesi da quando ho deciso di saltare completamente la Swift wormhole. In questi mesi ho imparato lentamente a smettere di scrivere modelli di codice in stile Objective-C con sintassi Swift e ho iniziato a sfruttare effettivamente il nuovo linguaggio.

Ma una cosa che ho recentemente raccolto è che sto ancora usando una brutta sintassi non Swift con tutte le mie strutture CGGeometry.

CGRect, CGSize, CGPoint

Sintassi C. A sheep in wolf’s clothing

Ho la grande sensazione che molti sviluppatori Swift saranno colpevoli di questo. Alza la mano se hai usato uno di questi nel tuo codice:

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

Aggiornamento: A partire da Swift 3, queste funzioni sono state rimosse.

Sì, l’ho pensato. Ma non preoccuparti, non c’è niente di cui vergognarsi yet ancora.

La cosa che non va in questo è che rompe la convenzione di codifica di Swift, funzionerà ancora, ma sembra molto più simile a qualcosa che se appartiene a Objective-C o addirittura, oserei dire, Java. * shudders*

Ad uno sviluppatore iOS o OSX esperto, con una breve occhiata potrebbero facilmente dirti cosa sta facendo quel codice. Non hanno bisogno di etichette di argomenti sulle struttureCGGeometry perché tutti conoscono quegli argomenti e la loro sequenza a memoria. Tranne che non lo fanno.

Molto di ciò che Swift è di essere amichevole con i nuovi arrivati di lingua così come i principianti di programmazione completa. Se dovessero guardare quel codice, non avrebbero idea di cosa rappresentino quei numeri. Quindi promettiamo tutti di essere buoni cittadini Swift e iniziare a usare le versioni 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)

Per un po ‘ di sintassi in più, la verbosità del nostro codice è completamente comprensibile a prima vista. Inoltre, un ulteriore vantaggio di utilizzare l’inizializzatore di strutturaCGGeometry è che ora non siamo solo limitati a utilizzareCGFloat come argomenti, possiamo anche passareInt eDouble!

Zero

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Aggiornamento: a partire da Swift 3, queste funzioni sono state rimosse.

Mentre ci siamo, probabilmente stai ancora usando anche questi, amirite? lel.

Dovremmo anche aggiornarli per usare la sintassi più recente e più veloce. Ma non preoccuparti, la sintassi è solo un carattere extra più lungo. Riesci a indovinare di cosa si tratta?

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

Un’altra cosa per farti salire a bordo con questo è che l’evidenziatore di sintassi di Xcode, a seconda della combinazione di colori, evidenzierà.zero, rendendolo un po ‘ più leggero sul tuo carico cognitivo.

Valore di recupero

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

Aggiornamento: A partire da Swift 3, queste funzioni sono state rimosse.

Se tu fossi o sei ancora un buon cittadino Objective-C, avresti usato questi getter di valore quando volevi un valore specifico del rect. Ma aspetta un secondo, perché non accediamo direttamente ai valori?

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

Per questo motivo, le applicazioni dovrebbero evitare di leggere e scrivere direttamente i dati memorizzati nella struttura dati CGRect. Invece, usa le funzioni descritte qui per manipolare i rettangoli e recuperare le loro caratteristiche.

— Apple, CGGeometry Reference Documentation

Probabilmente ci sono ancora molti di voi che non si sono preoccupati di tali formalità, ma va bene. Swift ci ha alleviato da un’API così semplice e ha invece fornito semplici variabili di notazione dot.

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

Ci sono molti altri esempi di queste sottigliezze disponibili negli Swift playgrounds che ho fornito per completare questo post. Il link sarà in fondo alla pagina.

Mutabilità

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

Non solo sei in grado di modificare i singoli valori del frame di una vista, ma sei anche in grado di sostituire completamente intere sotto-strutture. Ecco:

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

Questa piccola funzionalità da sola è sufficiente per smettere di usare Objective-C. Mutability suCGRect s senza doverne creare uno nuovo completamente e resettare il valore. È stato solo meno di due anni fa che noi come sviluppatori Objective-C siamo stati costretti a scrivere codice di modifica del frame in questo modo:

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;

Non conosco te, ma scrivere questo mi ha davvero stressato. Creare una strutturanewFrame dal frame diview, modificarla e quindi reimpostare nuovamente la proprietàframe sulview. No grazie, mai, mai più per favore.

Non dimenticare

Ci sono anche un paio di altri costrutti all’interno di UIKit per i quali queste modifiche sono applicabili a:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.