2016-01-11 14 views
5

Khi tôi đã tìm hiểu về Đồ họa chính nhanh chóng, các hướng dẫn mà tôi đã xem trên youtube sử dụng chức năng CGRectMake thay vì khởi tạo CGRect để tạo một ví dụ CGRect.Tại sao lại cung cấp cả bộ khởi tạo CGRect và chức năng CGRectMake?

Điều này thật lạ với tôi. Tôi không hiểu tại sao tôi nên sử dụng cái cũ vì các tham số giống nhau và tôi nghĩ rằng không có lợi ích về hiệu năng khi sử dụng hàm XXXMake.

Ngoài ra, tại sao thậm chí nhanh chóng có chức năng "Make", khi CGRect đã có bộ khởi tạo với chính xác cùng thông số? Tôi nghĩ rằng các nhà phát triển của các mô-đun đang sử dụng một mẫu thiết kế nhất định mà tôi không biết. Họ đã sử dụng một? Nếu có, nó là cái gì? Tôi thực sự muốn biết một số mẫu thiết kế khác.

Trả lời

9

Câu trả lời ngắn:CGRectMake không được "cung cấp bởi Swift". Hàm C tương ứng trong khung công tác CoreGraphics được nhập tự động và do đó có sẵn trong Swift. câu trả lời

dài: CGRectMake được định nghĩa trong "CGGeometry.h" từ khuôn khổ CoreGraphics như

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 (Objective-) C, chức năng cung cấp một cách thuận tiện để khởi tạo một CGRect biến:

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

Trình biên dịch Swift tự động nhập tất cả các chức năng từ tập tin tiêu đề Foundation (nếu họ là Swift-tương thích), vì vậy này được nhập khẩu như

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

Bạn có thể sử dụng một hoặc một trong những initializers 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) 

Tôi không nghĩ rằng nó làm cho bất kỳ sự khác biệt hiệu suất. Nhiều người có thể sử dụng CGRectMake() vì họ đã quen với số này từ số cũ trước Swift lần. Initializers Swift có nhiều "Swifty" và biểu cảm hơn với nhãn lập luận rõ ràng:

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

Cập nhật: Tính đến Swift 3/Xcode 8,CGRectMake không còn sẵn trong Swift .

Các vấn đề liên quan