Swift: CGRect, CGSize & CGPoint

sunteți (probabil) face greșit

Andyy speranță
andyy hope

follow

2 februarie 2016 · 4 min read

au trecut aproximativ opt luni solide de când am decis pentru prima dată să sar complet în gaura de vierme rapidă. În acele luni am învățat încet să nu mai scriu modele de cod de stil Objective-C cu sintaxă Swift și am început să profit de fapt de noua limbă.

dar un lucru pe care l-am luat recent este că încă folosesc sintaxa urâtă non-rapidă cu toate structurile meleCGGeometry.

CGRect, CGSize, CGPoint

sintaxa C. O oaie în haine de lup

am un sentiment mare că o mulțime de dezvoltatori Swift vor fi vinovați de acest lucru. Ridicați mâna dacă ați folosit oricare dintre acestea în codul dvs:

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

actualizare: începând cu Swift 3, Aceste funcții au fost eliminate.

da, m-am gândit așa. Dar nu vă faceți griji, nu este nimic de care să vă fie rușine …încă.

lucrul care este în neregulă cu acest lucru este că încalcă Convenția de codificare Swift, va funcționa în continuare, dar arată mult mai mult ca ceva care, dacă aparține Objective-C sau chiar, îndrăznesc să spun, Java. *shudders *

unui dezvoltator iOS sau OSX experimentat, cu o scurtă privire, vă pot spune cu ușurință ce face acel cod. Ei nu au nevoie de etichete argument pe CGGeometry structuri pentru că toată lumea știe aceste argumente, și secvența lor de pe de rost. Cu excepția faptului că nu.

o mare parte din ceea ce înseamnă Swift este să fii prietenos cu nou-veniții de limbă, precum și cu începătorii de programare completă. Dacă ar fi să se uite la acel cod, ei nu ar avea nici o idee ce reprezintă aceste numere. Deci, să jurăm cu toții să fim buni cetățeni Swift și să începem să folosim versiunile 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)

pentru o sintaxă puțin suplimentară, verbozitatea codului nostru este complet de înțeles la prima vedere. De asemenea, un bonus suplimentar de utilizare a CGGeometry Struct initializer este că acum nu ne limităm doar la utilizarea CGFloat ca argumente, putem trece și în Int și Double!

Zero

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

actualizare: începând cu Swift 3, Aceste funcții au fost eliminate.

în timp ce suntem la el, probabil că încă mai folosiți și acestea, amirite? lel.

de asemenea, ar trebui să le actualizăm pentru a utiliza sintaxa mai nouă și mai rapidă. Dar nu vă faceți griji, sintaxa este doar un caracter suplimentar mai lung. Poți ghici ce este?

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

Un alt lucru pentru a vă aduce la bord cu acest lucru este că evidențiatorul de sintaxă al Xcode va evidenția, în funcție de schema de culori,.zero, făcându-l puțin mai ușor pe sarcina dvs. cognitivă.

recuperarea valorii

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

actualizare: începând cu Swift 3, Aceste funcții au fost eliminate.

Dacă ați fost sau sunteți în continuare un bun cetățean Objective-C, ați fi folosit acești getteri de valoare atunci când ați dorit o anumită valoare a rect. Dar stai puțin, de ce nu accesăm direct valorile?

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

Din acest motiv, aplicațiile dvs. ar trebui să evite citirea și scrierea directă a datelor stocate în structura de date CGRect. În schimb, utilizați funcțiile descrise aici pentru a manipula dreptunghiurile și pentru a prelua caracteristicile acestora.

— Apple, Cggeometry Reference Documentation

probabil că mulți dintre voi nu s-au deranjat cu astfel de formalități, dar este în regulă. Swift ne-a atenuat de o astfel de API fără pretenții și, în schimb, a furnizat variabile simple de notare a punctelor.

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

există o mulțime de exemple de aceste frumuseți disponibile în locurile de joacă Swift pe care le-am oferit pentru a completa acest post. Linkul va fi în partea de jos a paginii.

Mutabilitate

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

nu numai că puteți modifica valorile individuale ale cadrului unei vizualizări, dar puteți înlocui complet sub-structuri întregi. Iată:

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

această caracteristică mică este suficientă pentru a opri utilizarea Objective-C. Mutabilitate peCGRects fără a fi nevoie să creați una nouă în întregime și să resetați valoarea. A fost doar mai puțin de doi ani în urmă că noi, ca dezvoltatorii Objective-C au fost obligați să scrie cod de modificare cadru ca aceasta:

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;

nu știu despre tine, dar scrisul care m-a stresat cu adevărat. Crearea unuinewFrame struct dinview‘s cadru, modificarea acestuia, și apoi resetareaframe proprietate peview din nou. Nu, mulțumesc, niciodată, niciodată, te rog.

nu uitați

există și alte câteva construcții în cadrul UIKit pentru care aceste modificări sunt aplicabile:

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

Lasă un răspuns

Adresa ta de email nu va fi publicată.