2016-01-11 6 views
5

Als ich über Core-Grafiken in Swift lernte, verwenden die Tutorials, die ich auf youtube sah, die CGRectMake-Funktion anstelle des Initialisierers CGRect, um eine CGRect Instanz zu erstellen.Warum bietet swift sowohl einen CGRect-Initialisierer als auch eine CGRectMake-Funktion?

Das ist so komisch für mich. Ich verstehe nicht, warum sollte ich die erstere verwenden, weil die Parameter identisch sind und ich denke, es gibt keinen Leistungsvorteil für die Verwendung der XXXMake-Funktion.

Warum hat swift sogar eine solche "Make" -Funktion, wenn CGRect bereits einen Initialisierer mit genau den gleichen Parametern hat? Ich denke, die Entwickler der Module verwenden ein bestimmtes Designmuster, das ich nicht kenne. Haben sie eines benutzt? Wenn ja, was ist das? Ich möchte wirklich mehr Designmuster kennenlernen.

Antwort

9

Kurze Antwort:CGRectMake ist nicht "von Swift" zur Verfügung gestellt. Die entsprechende C-Funktion im CoreGraphics Framework wird automatisch importiert und steht somit in Swift zur Verfügung.

Longer Antwort: CGRectMake in "CGGeometry.h" aus dem Core Graphics Framework als

CG_INLINE CGRect 
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) 
{ 
    CGRect rect; 
    rect.origin.x = x; rect.origin.y = y; 
    rect.size.width = width; rect.size.height = height; 
    return rect; 
} 

In (objektiv-) C definiert ist, stellt diese Funktion eine bequeme Möglichkeit zu initialisieren ein CGRect Variable:

CGRect r = CGRectMake(x, y, h, w); 

Der Swift-Compiler importiert automatisch alle Funktionen aus den Foundation Header-Dateien (wenn sie Swift-kompatibel sind), so dass diese als

importiert
public func CGRectMake(x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect 

Sie entweder das eine oder einer der Swift initializers können

public init(origin: CGPoint, size: CGSize) 
public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) 
public init(x: Double, y: Double, width: Double, height: Double) 
public init(x: Int, y: Int, width: Int, height: Int) 

Ich denke nicht, dass es irgendwelche Leistungsunterschiede macht. Viele Leute könnten CGRectMake() verwenden, weil sie von der alten pre-Swift mal daran gewöhnt sind. Die Swift initializers sind mehr "swifty" und ausdruck mit dem expliziten Argumente Labels:

let rect = CGRect(x: x, y: x, width: w, height: h) 

Update: Ab Swift 3/Xcode 8,CGRectMake ist nicht mehr in Swift .

Verwandte Themen