Swift: CGRect, CGSize & CGPoint

Jsi (pravděpodobně) dělá to špatně

Andyy Doufám, že
Andyy Doufám, že

Sledovat

Únor 2, 2016 · 4 min číst

je To o pevné osm měsíců, co jsem se poprvé rozhodla pro skok úplně do Swift červí díry. Během těchto měsíců jsem se pomalu naučil přestat psát vzory kódu ve stylu Objective-C se syntaxí Swift, a začal skutečně využívat nový jazyk.

ale jedna věc, kterou jsem nedávno zachytil, je, že stále používám ošklivou syntaxi podobnou Swift se všemi svými strukturami CGGeometry.

CGRect, CGSize, CGPoint

C syntaxe. Ovce ve vlčím oblečení

mám velký pocit, že za to bude vinno mnoho vývojářů Swift. Zvedněte ruku, pokud jste některý z nich používali ve svém kódu:

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

aktualizace: od Swift 3 byly tyto funkce odstraněny.

Ano, myslel jsem si to. Ale nebojte se, není se za co stydět … zatím.

co je na tom špatného je to, že se to zlomí Swift kódování konvence, to bude ještě fungovat, ale vypadá to mnohem více jako něco, že když to patří v Objective-C nebo dokonce, troufám si říct, Java. * shudders *

pro zkušeného vývojáře iOS nebo OSX, s krátkým pohledem by vám mohli snadno říct, co tento kód dělá. Nepotřebují popisky argumentů na strukturách CGGeometry, protože každý zná tyto argumenty a jejich posloupnost nazpaměť. Kromě toho, že ne.

hodně z toho, co Swift je o je přátelský k jazykovým nováčkům, stejně jako úplné začátečníky programování. Kdyby se podívali na tento kód, neměli by tušení, co tato čísla představují. Takže pojďme všichni slib být dobrý Swift občanů a začít používat Swift verze:

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)

Pro trochu extra syntaxe, podrobnost náš kód je zcela pochopitelné na první pohled. Také, bonus pomocí CGGeometry struct inicializátoru je, že teď jsme nejsou omezeny pouze na použití CGFloat jako argumenty, můžeme také předat v IntDouble!

Zero

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

aktualizace: od Swift 3 byly tyto funkce odstraněny.

zatímco jsme u toho, pravděpodobně je stále používáte, amirite? lel.

měli bychom je také aktualizovat, abychom použili novější syntaxi Swiftier. Ale nebojte se, syntaxe je jen o další znak delší. Můžete hádat, co to je?

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

Další věc, aby vás dostat na palubu s tím, že Xcode je zvýrazňovač syntaxe bude, v závislosti na vašem barevné schéma, zvýrazněte .zero, takže je to trochu lehčí na kognitivní zatížení.

Hodnota vyhledávání

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

Update: Jako Swift 3, tyto funkce byly odstraněny.

Pokud jste byli nebo stále jste dobrým občanem Objective-C, použili byste tyto hodnoty, když jste chtěli určitou hodnotu Rekt. Ale počkejte chvíli, proč prostě nepřistupujeme přímo k hodnotám?

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

z tohoto důvodu by se vaše aplikace měly vyhnout přímému čtení a zápisu dat uložených v datové struktuře CGRect. Místo toho použijte zde popsané funkce k manipulaci s obdélníky a získání jejich charakteristik.

— Apple, CGGeometry Referenční Dokumentaci

Tam je asi ještě pořád hodně z vás se neobtěžoval s takovým formalitám, ale to je v pořádku. Swift nám zmírnil takové nepretty API a místo toho poskytl jednoduché proměnné bodové notace.

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

existuje spousta dalších příkladů těchto jemností dostupných na Swift hřištích, které jsem poskytl k doplnění tohoto příspěvku. Odkaz bude v dolní části stránky.

Mutabilita

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

nejen, že můžete měnit jednotlivé hodnoty rámce pohledu, ale také můžete zcela nahradit celé dílčí struktury. Viz:

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

Tento malý funkce sama o sobě je dostatečný důvod, aby přestali používat Objective-C. Proměnlivost na CGRecty, aniž by museli vytvořit nový a zcela obnovit hodnotu. Teprve před necelými dvěma lety jsme jako vývojáři Objective-C byli nuceni napsat takto modifikační kód rámce:

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;

nevím o vás, ale psaní, které mě opravdu vystresovalo. Vytvoření newFrame struct view‚s rámem, modifikovat ji, a pak resetování frame vlastnost view znovu. Ne, děkuji, už nikdy, prosím.

nezapomeňte,

Existuje také několik dalších konstrukty v UIKit, pro které tyto změny jsou platné do:

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.