2012-08-16 29 views
5

Giả sử tôi có phương pháp này:Gửi nil để CGPoint loại tham số

- (void)placeView:(UIView*)theView withCenterIn:(CGPoint)centerPoint; 

Vì vậy, tôi vượt qua quan điểm và một điểm để te trung tâm của quan điểm.

Nhưng điều đó xảy ra là tôi không cần chỉ định trung tâm, chỉ là chế độ xem.

Việc chuyển "số không" dẫn đến lỗi.

Vui lòng đề xuất cách bỏ qua điểm trung tâm.

Hãy ghi nhớ rằng tôi cần phải sử dụng phương pháp đó như thế này:

- (void)placeView:(UIView*)theView withCenterIn:(CGPoint)centerPoint{ 
    if(centerPoint == nil){//and I understand that it's a wrong comparison, as I cannot pass "nil" to CGPoint 
     //set a random center point 
    } 
    else{ 
     //set that view to the specified point 
    } 
} 

Cảm ơn trước

Trả lời

5

CGPoint là một C struct, bạn không thể vượt qua nil cho nó. Bạn có thể tạo một phương pháp riêng biệt mà không lấy không cần thiết CGPoint, và thoát khỏi tuyên bố if của bạn, như thế này:

- (void)placeView:(UIView*)theView withCenterIn:(CGPoint)centerPoint{ 
    //set that view to the specified point 
} 

- (void)placeView:(UIView*)theView { 
    //set a random center point 
} 

Nếu bạn khăng khăng giữ một phương pháp, bạn có thể chỉ định một điểm là "đặc biệt" (hãy nói, CGMakePoint(CGFLOAT_MAX, CGFLOAT_MAX)), quấn nó vào một số #define và sử dụng thay vì nil.

Tuy nhiên, một giải pháp khác sẽ được quấn bạn CGPoint trong NSValue:

NSValue *v = [NSValue withPoint:CGMakePoint(12, 34)]; 
CGPoint p = [v pointValue]; 
+0

Vì vậy, bạn đề nghị để tạo ra 2 phương pháp khác nhau, đúng không? –

+0

@ SavaMazăre Quyền, cách tiếp cận này là sạch hơn cả về triển khai của bạn (không cần thiết 'if') và trên người gọi của bạn (không cần thiết' withCenterIn: nil'). – dasblinkenlight

+0

Tôi hiểu, điều đó có ý nghĩa. Nhưng nếu tôi cần phải chỉ định 2 điểm khác nhau, ví dụ: placeView: witCenterIn: orOriginAt: và tôi đang kiểm tra xem tôi có trung tâm không, tôi làm việc với trung tâm, nếu không tôi làm việc với nguồn gốc. Tôi đã nghĩ đến việc truyền một mảng CGPoints, và kiểm tra nếu đối tượng ở chỉ mục: 0 là không, vì vậy tôi đã không lấy trung tâm -> Tôi sẽ sử dụng nguồn gốc (giả sử thực sự là một mảng với 2 đối tượng, một trong số đó là nil). –

12

Bạn không thể sử dụng nil như một chỉ số "không có điểm", bởi vì nó chỉ dành cho các đối tượng, và CGPoint là một struct. (Như dasblinkenlight đã nói.)

Trong thư viện hình học của tôi, tôi đã xác định "null" CGPoint để sử dụng làm trình giữ chỗ "không có điểm" và một hàm để kiểm tra. Kể từ khi các thành phần của một CGPointCGFloat s, và float s có một "giá trị không hợp lệ" đại diện đã - NAN, quy định tại math.h - Tôi nghĩ đó là điều tốt nhất để sử dụng:

// Get NAN definition 
#include <math.h> 

const CGPoint WSSCGPointNull = {(CGFloat)NAN, (CGFloat)NAN}; 

BOOL WSSCGPointIsNull(CGPoint point){ 
    return isnan(point.x) && isnan(point.y); 
} 
+0

hm .. thú vị .. –

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