hurtig: CGRect, Cgstørrelse & CGPoint

du gør det (sandsynligvis) forkert

andyy hope

Følg

Feb 2, 2016 · 4 min læs

det har været omkring en solid otte måneder siden jeg først besluttede at hoppe helt ind i det hurtige ormehul. I løbet af disse måneder har jeg langsomt lært at stoppe med at skrive Objective-C stil kode mønstre med hurtig syntaks, og begyndte at faktisk drage fordel af det nye sprog.

men en ting, jeg for nylig har hentet på, er, at jeg stadig bruger grimme ikke-hurtige syntaks med alle mineCGGeometry strukturer.

CGRect, CGSize, CGPoint

C syntaks. Et får i ulvens tøj

Jeg har en stor fornemmelse af, at mange hurtige udviklere vil være skyldige i dette. Løft din hånd, hvis du har brugt en af disse i din kode:

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

opdatering: fra hurtig 3 er disse funktioner blevet fjernet.

Ja, jeg troede det. Men rolig, det er ikke noget at skamme sig over …endnu.det, der er galt med dette, er, at det bryder Hurtigens kodningskonvention, det vil stadig fungere, men det ligner meget mere noget, hvis det hører hjemme i Objective-C eller endda, tør jeg sige det, Java. med et kort blik kunne de nemt fortælle dig, hvad den kode gør. De har ikke brug for argumentetiketter på CGGeometry strukturer, fordi alle kender disse argumenter og deres rækkefølge udenad. Bortset fra at de ikke gør det.

meget af, hvad hurtig handler om, er at være venlig over for sprogtilkomne såvel som komplette programmeringsbegyndere. Hvis de skulle se på den kode, ville de ikke have nogen anelse om, hvad disse tal repræsenterer. Så lad os alle løfte om at være gode hurtige borgere og begynde at bruge de hurtige versioner:

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)

for en lille smule ekstra syntaks er verbositeten af vores kode helt forståelig ved første øjekast. En ekstra bonus ved at bruge CGGeometry struct initialisator er, at vi nu ikke kun er begrænset til at bruge CGFloatsom argumenter, vi kan også passereIntogDouble!

nul

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

opdatering: fra hurtig 3 er disse funktioner blevet fjernet.

mens vi er ved det, bruger du sandsynligvis stadig disse også, amirite? lel.

Vi bør også opdatere disse for at bruge den nyere, hurtigere syntaks. Men rolig, syntaksen er kun et ekstra tegn længere. Kan du gætte, hvad det er?

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

en anden ting at få dig om bord med dette er, at kodes syntaksmarkering vil, afhængigt af dit farveskema, fremhæve.zero, hvilket gør det lidt lettere på din kognitive belastning.

værdi hentning

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

opdatering: fra hurtig 3 er disse funktioner blevet fjernet.

Hvis du var eller stadig er en god Objective-C borger, ville du have brugt disse værdi getters, når du ønskede en bestemt værdi af rect. Men vent et øjeblik, hvorfor får vi ikke bare adgang til værdierne direkte?

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

af denne grund bør dine applikationer undgå direkte læsning og skrivning af de data, der er gemt i cgrect-datastrukturen. Brug i stedet de funktioner, der er beskrevet her, til at manipulere rektangler og hente deres egenskaber.

— Apple, Cggeometry Reference Documentation

Der er sandsynligvis stadig mange af jer, der ikke gider med sådanne formaliteter, men det er ok. Hurtig har lettet os af en sådan uhøjtidelighed API og i stedet forudsat simple dot notation variabler.

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

Der er mange flere eksempler på disse niceties tilgængelige på de hurtige legepladser, jeg har leveret til at supplere dette indlæg. Linket vil være nederst på siden.

Mutability

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

ikke kun er du i stand til at ændre individuelle værdier for en visnings ramme, men du er også i stand til at erstatte hele understrukturer fuldstændigt. Se:

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

denne lille funktion alene er nok af en grund til at stoppe med at bruge Objective-C. Mutability påCGRects uden at skulle oprette en ny helt og nulstille værdien. Det var kun mindre end to år siden, at vi som Objective-C-udviklere blev tvunget til at skrive rammemodifikationskode som denne:

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;

Jeg ved ikke om dig, men at skrive det virkelig stressede mig. Oprettelse af ennewFrame struct fraview‘s ramme, ændring af den og derefter nulstilling afframe egenskaben påview igen. Nej tak, ikke nogensinde, nogensinde igen tak.

glem ikke

der er også et par andre konstruktioner inden for UIKit, som disse ændringer gælder for:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.