Swift: CGRect, CGSize & CGPoint

Du (sannsynligvis) gjør det galt

Ogyy Håp
2 februar 2016 · 4 min lese

det har vært om en solid åtte måneder siden jeg først bestemte meg for å hoppe helt inn i swift ormehull. I løpet av disse månedene har jeg sakte lært å slutte å skrive Objective-C stil kode mønstre Med Swift syntaks, og begynte å faktisk dra nytte av det nye språket.Men en ting jeg nylig har plukket opp er at jeg fortsatt bruker stygg, Ikke-Swift-lignende syntaks med alle mineCGGeometry strukturer.

CGRect, CGSize, CGPoint

c syntaks. En sau i ulveklær

jeg har en stor følelse av at Mange Swift-utviklere kommer til å være skyldige i dette. Rekk opp hånden hvis du har brukt noen av disse i koden din:

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

Oppdatering: Fra Swift 3 er disse funksjonene fjernet.

Ja, jeg trodde det. Men ikke bekymre deg, det er ingenting å skamme seg over … ennå.det som er galt med Dette er at Det bryter Swifts kodingskonvensjon, det vil fortsatt fungere, men det ser mye mer ut som noe som om det tilhører Objective-C eller til Og med, tør jeg si Det, Java. til en erfaren iOS-eller OSX-utvikler, med et kort blikk kan de lett fortelle deg hva den koden gjør. De trenger ikke argumentetiketter på CGGeometry strukturer fordi alle kjenner disse argumentene, og deres sekvens av hjertet. Bortsett fra at De ikke gjør det.

Mye Av Det Swift handler om, er å være vennlig til språk nykommere, så vel som komplette programmeringsbegynnere. Hvis de skulle se på den koden, ville de ikke ane hva disse tallene representerer. Så la oss alle løfte om å være gode Swift-borgere og begynne å bruke Swift-versjonene:

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 litt ekstra syntaks er verbositeten til koden vår helt forståelig ved første øyekast. Også en ekstra bonus ved å bruke CGGeometry struct initializer er at nå er vi ikke bare begrenset til å bruke CGFloat som argumenter, kan vi også passere i Int og Double!

Null

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Oppdatering: Fra Swift 3 har disse funksjonene blitt fjernet.

mens Vi er i gang, bruker du sannsynligvis også disse, amirite? lel.

Vi bør også oppdatere disse for å bruke nyere, Swiftier syntaks. Men ikke bekymre deg, syntaksen er bare bare et ekstra tegn lenger. Kan du gjette hva det er?

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

En annen ting å få deg om bord med dette Er At Xcodes syntaks highlighter vil, avhengig av fargeskjemaet ditt, markere .zero, noe som gjør det litt lettere på din kognitive belastning.

verdihenting

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

Oppdatering: Fra Swift 3 har disse funksjonene blitt fjernet.

hvis du var Eller fortsatt er En God Objective-c-borger, ville du ha brukt disse value getters når du ønsket en bestemt verdi av rect. Men vent litt, hvorfor får vi ikke bare tilgang til verdiene direkte?

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

av denne grunn bør programmene dine unngå å lese og skrive dataene som er lagret i cgrect-datastrukturen. Bruk i stedet funksjonene som er beskrevet her, til å manipulere rektangler og hente egenskapene deres.

— Apple, Cggeometry Reference Documentation

det er nok fortsatt mange av dere som ikke brydde seg med slike formaliteter, men det er ok. Swift har lindret oss av en slik unpretty API og i stedet gitt enkle dot notasjon 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

Det er mange flere eksempler på Disse niceties tilgjengelig I Swift playgrounds jeg har gitt for å supplere dette innlegget. Lenken 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 bare kan du endre individuelle verdier av en visnings ramme, men du kan også erstatte hele understrukturer helt. Se:

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

denne lille funksjonen alene er nok av en grunn til å slutte å bruke Objective-C. Mutability på CGRect s uten å måtte opprette en ny helt og tilbakestille verdien. Det var bare mindre enn to år siden at vi Som Objective-C utviklere ble tvunget til å skrive ramme modifikasjon kode som dette:

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 vet ikke om deg, men å skrive som virkelig stresset meg ut. Opprette en newFrame struct fra view‘s ramme, endre den, og deretter tilbakestilleframe egenskapen påview igjen. Nei takk, aldri igjen, vær så snill.

ikke glem

Det er også et par andre konstruksjoner innenfor UIKit som disse endringene gjelder 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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.