Swift: CGRect, CGSize & CGPoint

te (valószínűleg) rosszul csinálod

Andyy Hope
Andyy Hope

follow
Feb 2, 2016 · 4 min olvasni

már körülbelül egy szilárd nyolc hónap óta először úgy döntött, hogy ugrik teljesen a Swift féreglyuk. Ezekben a hónapokban lassan megtanultam abbahagyni az Objective-C stílusú kódminták Swift szintaxissal történő írását, és elkezdtem ténylegesen kihasználni az új nyelvet.

de egy dolgot nemrég vettem fel, hogy még mindig csúnya, nem Swift-szerű szintaxist használok az összes CGGeometry struktúrámmal.

CGRect, CGSize, CGPoint

C szintaxis. Egy bárány farkasruhában

van egy nagy érzésem, hogy sok Swift Fejlesztő lesz bűnös ebben. Emelje fel a kezét, ha ezek bármelyikét használta a kódjában:

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

frissítés: a Swift 3-tól ezek a funkciók eltávolításra kerültek.

Igen, gondoltam. De ne aggódj, nincs mit szégyellni … még.

ezzel az a baj, hogy megtöri a Swift kódolási konvencióját, továbbra is működni fog, de sokkal inkább úgy néz ki, mint valami, ha az Objective-C-be tartozik, vagy akár, merem mondani, Java. * shudders *

egy tapasztalt iOS vagy OSX fejlesztőnek, rövid pillantással könnyen elmondhatják, hogy mit csinál ez a kód. Nincs szükségük argumentumcímkékre a CGGeometry struktúrákon, mert mindenki ismeri ezeket az argumentumokat és azok sorrendjét fejből. Kivéve, hogy nem.

A Swift lényege, hogy barátságos legyen a nyelv újonnan érkezőivel, valamint a teljes programozási kezdőkkel. Ha megnéznék azt a kódot, fogalmuk sem lenne, mit jelentenek ezek a számok. Tehát fogadjuk meg, hogy jó Swift állampolgárok vagyunk, és kezdjük el használni a Swift verziókat:

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)

egy kis extra szintaxis érdekében a kódunk bőbeszédűsége első pillantásra teljesen érthető. A CGGeometry struct inicializer használatának további bónusza, hogy most már nem csak a CGFloat argumentumként történő használatára korlátozódunk, hanem a Int and Double!

nulla

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

frissítés: a Swift 3-tól ezek a funkciók eltávolításra kerültek.

Ha már itt tartunk, valószínűleg ezeket is használod, amirite? lel.

ezeket is frissítenünk kell az újabb, Swiftier szintaxis használatához. De ne aggódj, a szintaxis csak egy extra karakter hosszabb. Meg tudja tippelni, mi ez?

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

a másik dolog, hogy neked a fedélzeten ez az, hogy Xcode szintaxis kiemelő lesz, attól függően, hogy a színösszeállítás, jelölje ki a .zero, így, hogy egy kicsit könnyebb a kognitív terhelés.

érték visszakeresés

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

frissítés: a Swift 3-tól ezek a funkciók eltávolításra kerültek.

ha jó Objective-C állampolgár vagy, akkor ezeket az értékmérőket használta volna, amikor a rect adott értékét akarta. De várjunk csak, miért nem férünk hozzá közvetlenül az értékekhez?

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

emiatt az alkalmazásoknak kerülniük kell a CGRect adatstruktúrában tárolt adatok közvetlen olvasását és írását. Ehelyett használja az itt leírt függvényeket a téglalapok manipulálására és jellemzőik lekérésére.

— Apple, CGGeometry Reference Documentation

valószínűleg még mindig sokan vannak, akik nem foglalkoztak ilyen formaságokkal, de ez rendben van. A Swift enyhített minket egy ilyen igénytelen API-tól, ehelyett egyszerű pontjelölési változókat biztosított.

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

rengeteg további példa található ezekre a finomságokra a Swift playgrounds-ban, amelyet a bejegyzés kiegészítésére adtam. A link az oldal alján lesz.

Mutability

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

nem csak a nézet keretének egyedi értékeit változtathatja meg, hanem teljes alstruktúrákat is teljesen kicserélhet. Íme:

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

Ez a kis funkció önmagában elég ok arra, hogy hagyja abba az Objective-C. Mutability használatát a CGRects-en anélkül, hogy teljesen újat kellene létrehoznia és visszaállítania az értéket. Csak kevesebb, mint két évvel ezelőtt kényszerültünk mi, mint Objective-C fejlesztők, hogy ilyen keretmódosító kódot írjunk:

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;

nem tudom, hogy vagy vele, de az írás nagyon stresszelt. newFrame struktúra létrehozása a viewkeretéből, módosítása, majd a frame tulajdonság visszaállítása a view ismét. Nem, köszönöm, soha, soha többé, kérlek.

ne felejtsd el

van még egy pár más konstrukciók belül UIKit, amelyekre ezek a változások alkalmazhatók:

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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.