sei (probabilmente) sbagliato
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