te (valószínűleg) rosszul csinálod
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 CGRect
s-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 view
kereté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