2016-01-11 17 views
5

Kiedy szybko poznałem Core Graphics, samouczki, które oglądałem na youtube, używają funkcji CGRectMake zamiast inicjatora CGRect do utworzenia instancji CGRect.Dlaczego funkcja Swift zapewnia zarówno inicjator CGRect, jak i funkcję CGRectMake?

To jest dla mnie dziwne. Nie rozumiem, dlaczego powinienem używać tego pierwszego, ponieważ parametry są takie same i myślę, że nie ma żadnej korzyści z wydajności korzystania z funkcji XXXMake.

Co więcej, dlaczego Swift posiada taką funkcję "Make", kiedy już posiada ona inicjator o dokładnie takich samych parametrach? Myślę, że twórcy modułów używają pewnego wzorca projektowego, którego nie znam. Czy używali jednego? Jeśli tak, co to jest? Naprawdę chcę wiedzieć więcej wzorów.

Odpowiedz

9

Krótka odpowiedź:CGRectMake nie jest "dostarczony przez Swift". Odpowiednia funkcja C w strukturze CoreGraphics jest automatycznie importowana i dlatego dostępna w Swift.

Dłuższą: CGRectMake jest zdefiniowana w "CGGeometry.h" w ramach CoreGraphics jak

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; 
} 

W (Objective-) C, to funkcja zapewnia wygodny sposób zainicjować CGRect zmienna:

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

Kompilator Swift automatycznie importuje wszystkich funkcji z plików nagłówkowych Foundation (jeśli są one Swift-compatible), więc ta jest importowany jako

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

można użyć, że jeden, lub jeden z inicjalizatorów Swift

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) 

Nie sądzę, żeby to miało jakikolwiek wpływ na wydajność. Wiele osób może użyć CGRectMake(), ponieważ są przyzwyczajeni do tego ze starych czasów pre-Swift . W inicjalizatory Swift są bardziej "Swifty" i bardziej wyraziste z jawne etykiety Argument:

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

Aktualizacja: Od Swift 3/Xcode 8CGRectMake nie jest już dostępny w Swift .