2013-03-07 24 views
6

Tôi đang cố sử dụng cấu trúc để lưu trữ ba giá trị làm đơn vị để nói. Tôi gặp lỗi: "Expression not assignable" khi tôi cố gán giá trị cho các giá trị của cấu trúc từ chế độ xem siêu của đối tượng.iOS, Sử dụng cấu trúc trong Mục tiêu C, các giá trị cấu trúc không thể gán được từ chế độ xem siêu

Bất kỳ ai biết tại sao điều này là?

trong file .h lớp học của tôi của tôi đã xác định các cấu trúc và một tài sản

@interface MyClass : UIView 

{ 
    struct customStruct { 
     float a; 
     float b; 
     float c; 
    }; 

} 

@property (assign, nonatomic) struct customStruct myStruct; 

từ quan điểm siêu tôi cố gắng gán một giá trị và tôi nhận được một lỗi: "Expression not assignable"

object.myStruct.a = someValue; 

Trả lời

18

Thử này:

struct customStruct aStruct = object.myStruct; 
aStruct.a = someValue; 
object.myStruct = aStruct 

Đó là chính xác những tình huống tương tự như việc không thể làm được điều này:

view.frame.size.width = aWidthValue; 

BTW tuyên bố cấu trúc bên trong giao diện lớp học có vẻ như là một kiểu rất xấu. Điều này sạch hơn nhiều:

typedef struct { 
    float a; 
    float b; 
    float c; 
} customStruct; 

@interface MyClass : UIView 

@property (assign, nonatomic) customStruct myStruct; 
+2

Điều này không hoàn toàn chính xác vì anh ấy muốn cập nhật thành viên cấu trúc của mình và không đặt nó từ đầu – giorashc

+0

Cảm ơn! Khi bạn nói "Hãy thử điều này" là ba dòng trong superView. Xin lỗi nhưng bạn có thể làm rõ một chút không? – Mrwolfy

6

Điều này là do object.myStruct trả về bản sao thành viên cấu trúc của bạn và không có điểm thay đổi thành viên a của bản sao đó.

Bạn nên làm có được toàn bộ cấu trúc thay đổi thành viên và sau đó thiết lập các thành viên struct lại (sử dụng get/set phương pháp tổng hợp)

2

Xác định nó bên ngoài/trước interface phạm vi:

struct LevelPath{ 
    int theme; 
    int level; 
}; 

//here goes your interface line 
@interface BNGameViewController : UIViewController{ 
} 
//create propertee here 
@property (nonatomic, assign) struct LevelPath levelPath; 
1

Để thêm vào các đề xuất trước đó, tôi khuyên bạn không nên lưu trữ cấu trúc của bạn làm biến số thành viên. Ví dụ:

@interface MyClass() { 

    CGPoint myPoint; 

} 

Sau đó, trong lớp học của bạn, bạn có thể gán giá trị mới cho rằng struct trực tiếp:

myPoint.x = 100.0; 

thay vì khi đó là một @property, mà là read-only:

myPoint = CGPointMake(100.0, myPoint.y); 

Cho rằng đây không phải là một lớp con NSObject, trừ khi bạn ghi đè lên các phương thức getter/setter, tôi không thấy mục đích làm cho nó trở thành @property nữa, vì điều đó chủ yếu là hữu ích cho ARC để giúp w quản lý bộ nhớ của đối tượng của bạn. Nhưng xin vui lòng sửa tôi nếu tôi sai vào thời điểm đó (ouch).

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