robisz (prawdopodobnie) źle
minęło około ośmiu miesięcy, odkąd po raz pierwszy zdecydowałem się całkowicie wskoczyć do tunelu SWIFT. Przez te miesiące powoli nauczyłem się przestać pisać wzorce kodu w stylu Objective-C z szybką składnią i zacząłem faktycznie korzystać z nowego języka.
ale jedną rzeczą, którą ostatnio zauważyłem, jest to, że nadal używam brzydkiej składni podobnej do Swift ze wszystkimi moimi strukturami CGGeometry
.
CGRect, CGSize, CGPoint
składnia C. Owca w Wilczej skórze
mam duże przeczucie, że wielu programistów Swift będzie temu winnych. Podnieś rękę, jeśli używałeś któregokolwiek z nich w swoim kodzie:
let rect = CGRectMake(0, 0, 100, 100)let point = CGPointMake(0, 0)let size = CGSizeMake(100, 100)
Aktualizacja: od Swift 3 Funkcje te zostały usunięte.
Ale nie martw się, nie ma się czego wstydzić …jeszcze.
rzecz w tym, że łamie konwencję kodowania Swifta, nadal będzie działać, ale wygląda bardziej jak coś, co jeśli należy do Objective-C lub nawet, ośmielę się powiedzieć, Java. * dreszcze *
do doświadczonego programisty iOS lub OSX, z krótkim spojrzeniem mogą łatwo powiedzieć, co robi ten kod. Nie potrzebują etykiet argumentów w strukturachCGGeometry
, ponieważ każdy zna te argumenty i ich sekwencję na pamięć.
wiele z tego, co Swift jest o to, aby być przyjaznym dla nowych języków, jak również początkujących programistów. Gdyby spojrzeli na ten kod, nie mieliby pojęcia, co oznaczają te liczby. Więc ślubujmy być dobrymi obywatelami Swift i zacznijmy używać wersji Swift:
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)
dla trochę dodatkowej składni, gadatliwość naszego kodu jest całkowicie zrozumiała na pierwszy rzut oka. Dodatkową zaletą używaniaCGGeometry
inicjalizatora struktury jest to, że teraz nie ograniczamy się tylko do używaniaCGFloat
jako argumentów, możemy również przekazaćInt
IDouble
!
Zero
let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero
Aktualizacja: od Swift 3 Funkcje te zostały usunięte.
skoro już o tym mowa, to pewnie jeszcze ich używasz, amirite? lel.
powinniśmy je również aktualizować, aby używać nowszej, szybszej składni. Ale nie martw się, składnia jest tylko dodatkowym znakiem dłuższym. Zgadniesz, co to jest?
let rect = CGRect.zerolet size = CGSize.zerolet point = CGPoint.zero
kolejną rzeczą, która pomoże Ci w tym, jest to, że zakreślacz składni Xcode, w zależności od schematu kolorów, podświetli.zero
, dzięki czemu będzie nieco lżejszy na Twoim obciążeniu poznawczym.
pobieranie wartości
CGRect frame = CGRectMake(0, 0, 100, 100)CGFloat width = CGRectGetWidth(frame)CGFloat height = CGRectGetHeight(frame)CGFloat maxX = CGRectGetMaxX(frame)CGFloat maxY = CGRectGetMaxY(frame)
Aktualizacja: od Swift 3 Funkcje te zostały usunięte.
gdybyś był lub nadal jesteś dobrym obywatelem Objective-C, użyłbyś tych getterów wartości, gdy chciałeś określonej wartości rect. Ale poczekaj chwilę, dlaczego nie uzyskamy bezpośredniego dostępu do wartości?
CGFloat width = frame.size.widthCGFloat height = frame.size.height
z tego powodu aplikacje powinny unikać bezpośredniego odczytu i zapisu danych zapisanych w strukturze danych CGRect. Zamiast tego użyj funkcji opisanych tutaj do manipulowania prostokątami i pobierania ich cech.
— Apple, dokumentacja CGG
pewnie wielu z Was nie zawracało sobie głowy takimi formalnościami, ale jest ok. Swift złagodził nas z takiego bezpretensjonalnego API i zamiast tego dostarczył proste zmienne notacji kropkowej.
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let width = frame.widthlet height = frame.heightlet maxX = frame.maxXlet maxY = frame.maxY
na placach zabaw Swift, które podałem w celu uzupełnienia tego posta, dostępnych jest wiele innych przykładów tych fajnych zabaw. Link będzie na dole strony.
zmienność
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let view = UIView(frame: frame)view.frame.origin.x += 10
nie tylko możesz zmienić poszczególne wartości ramki widoku, ale także możesz całkowicie zastąpić całe podpowstruktury. Oto:
let view = UIView(frame: .zero)view.frame.size = CGSize(width: 10, height: 10)view.frame.origin = CGPoint(x: 10, y: 10)
Ta mała funkcja jest wystarczającym powodem, aby przestać używać Objective-C. zmienność naCGRect
s bez konieczności tworzenia nowej całkowicie i resetowania wartości. Dopiero niecałe dwa lata temu jako programiści Objective-C byliśmy zmuszeni do napisania kodu modyfikacji ramki w ten sposób:
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;
Nie wiem jak wy, ale pisanie to mnie naprawdę stresowało. Utworzenie strukturynewFrame
z ramkiview
, zmodyfikowanie jej, a następnie ponowne zresetowanie właściwościframe
naview
. Nie, dziękuję, nigdy więcej, proszę.
nie zapomnij
istnieje również kilka innych konstrukcji w UIKit, dla których te zmiany mają zastosowanie 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