2010-11-21 25 views
5

Tôi có ba câu hỏi xung quanh những gì tôi nghĩ là chủ đề của cấu trúc trong obj-cvà sử dụng obj-c CGPoint, CGRect, và những thứ khác

1) Tại sao tôi thường xuyên (hoặc luôn luôn) không thể một var thành viên đó là một CGPoint hoặc một CGRect và thiết lập các giá trị từng cái một? Tôi tìm thấy tôi phải làm:

CGPoint point; 
point.x = someValue; 
point.y = someOtherValue; 
obj.myPoint = point; 

thay vì chỉ đơn giản là obj.myPoint.x = someValue, vv

2) Có hành vi này là nhất quán trên tất cả các cấu trúc trong obj-c?

3) Có cách nào dễ dàng để thêm hai CGPoint không? Nó có vẻ như đã có, nhưng tôi không thể tìm thấy một. Tôi nghĩ rằng nó sẽ là cồng kềnh nếu tôi phải sử dụng một CGPoint tạm thời để tích lũy các giá trị giữa hai CGPoints trước khi thiết lập var var đến temp var (vì không thể chỉ làm pointA.x + = pointB.x (cùng cho y).

Trả lời

0

này là hoàn toàn bình thường. các 'obj' sở hữu mà var và có getter và setter, bạn không thể sửa đổi các bộ phận của biến đó.

điều tốt nhất để làm là sao chép các struct và sửa đổi bất cứ điều gì bạn cần.

Cũng lưu ý bạn có thể sử dụng chức năng CGPointMake (x, y) (và tương tự cho tất cả các cấu trúc CG), đó là dễ dàng hơn nhiều.

Để cập nhật này là dễ nhất:

CGPoint point = obj.myPoint; 
point.x += 10.0f; 
obj.myPoint = point; 

obj-C 2.0 ẩn getter và setter mà trông như thế này:

CGPoint point = [obj myPoint]; 
point.x += 10.0f; 
[obj setMyPoint:point]; 
11

1) Từ @sb trong một câu trả lời cho Cocoa Objective-c Property C structure assign fails

Điều đó sẽ không thực hiện bất cứ điều gì, bởi vì [t member] trả về một cấu trúc, đó là "giá trị r", tức là. một giá trị chỉ hợp lệ để sử dụng ở phía bên tay phải của bài tập. Nó có giá trị, nhưng vô nghĩa khi cố gắng thay đổi giá trị đó.

Về cơ bản, bạn chỉ cần sống với thực tế là bạn không thể đặt các trường cấu trúc trực tiếp khi được trả về từ một hàm.

2) Có

3) Đáng tiếc là tôi không nghĩ rằng có một built-in phương pháp thuận tiện cho việc thêm hai CGPoint. Nếu bạn tìm thấy tự mình làm điều này thường xuyên, bạn có thể làm của riêng bạn:

CGPoint CGPointAdd(CGPoint p1, CGPoint p2) 
{ 
    return CGPointMake(p1.x + p2.x, p1.y + p2.y); 
} 

và sau đó sử dụng nó như:

obj.pointA = CGPointAdd(obj.pointA, pointB);

không thanh lịch như obj.pointA.X += ... nhưng đôi khi cuộc sống là không công bằng.

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