Jsi (pravděpodobně) dělá to špatně
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 Int
Double
!
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 CGRect
y, 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