Swift: CGRect, CGSize & CGPoint

Je bent (waarschijnlijk) het doen van het verkeerde

Andyy Hoop
Andyy Hoop

Volgen

Feb 2, 2016 · 4 min lezen

Het is al over een solide acht maanden geleden dat ik voor het eerst besloot om te springen volledig in de Swift wormhole. In die maanden heb ik langzaam geleerd om te stoppen met het schrijven van Objective-C stijl code patronen met snelle syntaxis, en begon om daadwerkelijk te profiteren van de nieuwe taal.

maar een ding dat ik onlangs heb opgepikt is dat ik nog steeds lelijke niet-Swift-achtige syntaxis gebruik met al mijn CGGeometry structuren.

CGRect, CGSize, CGPoint

C syntaxis. Een schaap in wolfskleding

Ik heb een groot gevoel dat veel Swift ontwikkelaars hier schuldig aan zullen zijn. Steek je hand op als je een van deze in je code hebt gebruikt:

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

Update: vanaf Swift 3 zijn deze functies verwijderd.

Ja, ik dacht van wel. Maar maak je geen zorgen, het is niets om je voor te schamen …nog niet.

het ding dat hier mis mee is is dat het Swift ‘ S codering conventie breekt, het zal nog steeds werken, maar het lijkt veel meer op iets dat als het hoort in Objective-C of zelfs, durf ik het zeggen, Java. * huivert *

naar een doorgewinterde iOS of OSX ontwikkelaar, met een korte blik kunnen ze je gemakkelijk vertellen wat die code doet. Ze hebben geen argument labels nodig op CGGeometry structuren omdat iedereen die argumenten kent, en hun volgorde uit het hoofd. Behalve dat ze dat niet doen.

veel waar Swift over gaat is vriendelijk zijn voor taal nieuwkomers en complete programmeer beginners. Als ze naar die code zouden kijken, zouden ze geen idee hebben wat die getallen vertegenwoordigen. Dus laten we allemaal beloven goede Swift burgers te zijn en beginnen met het gebruik van de Swift versies:

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)

voor een beetje extra syntaxis, de breedsprakelijkheid van onze code is volledig begrijpelijk op het eerste gezicht. Een extra bonus van het gebruik van deCGGeometry struct initializer is dat we nu niet alleen beperkt zijn tot het gebruik van als argumenten, we kunnen ook doorgaan in Int en Double!

nul

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Update: vanaf Swift 3 zijn deze functies verwijderd.

terwijl we bezig zijn, gebruikt u deze waarschijnlijk ook nog, amirite? lel.

we moeten deze ook bijwerken om de nieuwere, snellere syntaxis te gebruiken. Maar maak je geen zorgen, de syntaxis is slechts net een extra karakter langer. Kun je raden wat het is?

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

een ander ding om u aan boord te krijgen met dit is dat Xcode ‘ s syntaxis highlighter, afhankelijk van uw kleurenschema, de .zero zal markeren, waardoor het een beetje lichter op uw cognitieve belasting.

waarde ophalen

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

Update: vanaf Swift 3 zijn deze functies verwijderd.

Als u een goede Objective-C burger was of nog steeds bent, zou u deze waarde getters hebben gebruikt wanneer u een specifieke waarde van de rect wilde. Maar wacht even, waarom gaan we niet direct naar de waarden?

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

om deze reden moeten uw applicaties vermijden de gegevens die zijn opgeslagen in de cgrect-gegevensstructuur direct te lezen en te schrijven. Gebruik in plaats daarvan de hier beschreven functies om rechthoeken te manipuleren en hun kenmerken terug te halen.

– Apple, CGGeometry Reference Documentation

Er zijn waarschijnlijk nog veel van jullie die zich niet druk maakten over dergelijke formaliteiten, maar dat is ok. Swift heeft ons verlicht van zo ‘ n unpretty API en in plaats daarvan voorzien van eenvoudige dot notatie variabelen.

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

Er zijn veel meer voorbeelden van deze subtiliteiten beschikbaar in de Swift playgrounds die ik heb gegeven om dit bericht aan te vullen. De link staat onderaan de pagina.

Mutability

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

u kunt niet alleen individuele waarden van het frame van een weergave wijzigen, maar u kunt ook hele substructuren volledig vervangen. Ziehier:

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

deze kleine functie alleen is genoeg reden om te stoppen met het gebruik van Objective-C. Mutability op CGRects zonder een nieuwe volledig aan te maken en de waarde te resetten. Het was slechts minder dan twee jaar geleden dat wij als Objective-C ontwikkelaars gedwongen werden om frame modificatiecode als deze te schrijven:

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;

Ik weet niet hoe het met u zit, maar het schrijven daarvan stresseerde me echt. Het aanmaken van een newFrame struct vanuit de view’s frame, het aanpassen, en dan resetten van de eigenschap op de view opnieuw. Nee dank je, nooit meer, nooit meer alsjeblieft.

vergeet niet

er zijn ook een paar andere constructies binnen UIKit waarvoor deze wijzigingen van toepassing zijn op:

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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.