Swift: CGRect, CGSize & CGPoint

Du machst es (wahrscheinlich) falsch

Andyy Hope
Andyy Hope

Follow

Feb 2, 2016 · 4 min read

Es ist ungefähr acht Monate her, seit ich beschlossen habe, komplett in das Swift-Wurmloch zu springen. In diesen Monaten habe ich langsam gelernt, Objective-C-Codemuster mit Swift-Syntax nicht mehr zu schreiben, und habe begonnen, die neue Sprache tatsächlich zu nutzen.

Aber eine Sache, die ich kürzlich aufgegriffen habe, ist, dass ich immer noch hässliche, nicht Swift-ähnliche Syntax mit all meinen CGGeometry Strukturen verwende.

CGRect, CGSize, CGPoint

C-Syntax. Ein Schaf im Wolfspelz

Ich habe das große Gefühl, dass viele Swift-Entwickler daran schuld sein werden. Heben Sie Ihre Hand, wenn Sie eines davon in Ihrem Code verwendet haben:

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

Update: Ab Swift 3 wurden diese Funktionen entfernt.

Ja, ich dachte schon. Aber keine Sorge, es ist nichts zu schämen … noch.Das, was daran falsch ist, ist, dass es Swifts Codierungskonvention bricht, es wird immer noch funktionieren, aber es sieht viel mehr nach etwas aus, wenn es in Objective-C oder sogar, wage ich es zu sagen, Java gehört. *schaudert *

Für einen erfahrenen iOS- oder OSX-Entwickler können sie mit einem kurzen Blick leicht erkennen, was dieser Code tut. Sie benötigen keine Argumentbeschriftungen für CGGeometry Strukturen, da jeder diese Argumente und ihre Reihenfolge auswendig kennt. Außer, dass sie es nicht tun.

Vieles, worum es bei Swift geht, ist freundlich zu Sprachneulingen sowie kompletten Programmieranfängern. Wenn sie sich diesen Code ansehen würden, hätten sie keine Ahnung, was diese Zahlen darstellen. Lassen Sie uns also alle geloben, gute Swift-Bürger zu sein und die Swift-Versionen zu verwenden:

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)

Für ein bisschen mehr Syntax ist die Ausführlichkeit unseres Codes auf den ersten Blick völlig verständlich. Ein zusätzlicher Bonus bei der Verwendung des CGGeometry -Strukturinitialisierers ist, dass wir jetzt nicht nur CGFloat als Argumente verwenden, sondern auch Int und Double !

Null

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Update: Ab Swift 3 wurden diese Funktionen entfernt.

Während wir gerade dabei sind, verwenden Sie diese wahrscheinlich auch noch, Amirit? lel.

Wir sollten diese auch aktualisieren, um die neuere, schnellere Syntax zu verwenden. Aber keine Sorge, die Syntax ist nur ein zusätzliches Zeichen länger. Können Sie erraten, was es ist?

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

Eine andere Sache, um Sie an Bord zu bringen, ist, dass der Syntax-Highlighter von Xcode, abhängig von Ihrem Farbschema, die .zero , so dass es ein wenig leichter auf Ihre kognitive Belastung.

Abrufen von Werten

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

Update: Ab Swift 3 wurden diese Funktionen entfernt.

Wenn Sie ein guter Objective-C-Bürger wären oder immer noch sind, hätten Sie diese value getter verwendet, wenn Sie einen bestimmten Wert des rect wollten. Aber moment mal, warum greifen wir nicht direkt auf die Werte zu?

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

Aus diesem Grund sollten Ihre Anwendungen vermeiden, die in der CGRect-Datenstruktur gespeicherten Daten direkt zu lesen und zu schreiben. Verwenden Sie stattdessen die hier beschriebenen Funktionen, um Rechtecke zu bearbeiten und ihre Eigenschaften abzurufen.

— Apple, CGGeometry Reference Documentation

Es gibt wahrscheinlich immer noch viele von Ihnen, die sich nicht um solche Formalitäten gekümmert haben, aber das ist in Ordnung. Swift hat uns von einer so unprätentiösen API befreit und stattdessen einfache Punktnotationsvariablen bereitgestellt.

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

Es gibt viele weitere Beispiele für diese Feinheiten in den Swift Playgrounds, die ich zur Ergänzung dieses Beitrags bereitgestellt habe. Der Link befindet sich am Ende der Seite.

Veränderlichkeit

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

Sie können nicht nur einzelne Werte des Frames einer Ansicht ändern, sondern auch ganze Unterstrukturen vollständig ersetzen. Siehe:

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

Diese kleine Funktion allein ist ein Grund genug, Objective-C nicht mehr zu verwenden. Veränderlichkeit auf CGRects, ohne einen neuen vollständig erstellen und den Wert zurücksetzen zu müssen. Erst vor weniger als zwei Jahren waren wir als Objective-C-Entwickler gezwungen, Frame-Modifikationscode wie diesen zu schreiben:

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;

Ich weiß nichts über dich, aber das zu schreiben hat mich wirklich gestresst. Erstellen einer newFrame -Struktur aus dem view -Frame, ändern Sie sie und setzen Sie dann die frame -Eigenschaft auf view erneut zurück. Nein danke, nie, nie wieder bitte.

Vergiss nicht

Es gibt auch ein paar andere Konstrukte in UIKit, für die diese Änderungen gelten:

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.