2010-05-17 34 views
9

Tôi đang làm việc trên một ứng dụng sử dụng Dữ liệu cốt lõi làm phụ trợ của nó để quản lý các bản ghi SQLite. Tôi có tất cả mọi thứ làm việc với các chuỗi và số, nhưng vừa thử thêm các lĩnh vực BOOL và dường như không thể làm việc.Dữ liệu cốt lõi và thiết lập BOOL

Trong biểu tượng .xcdatamodel, tôi đã thêm trường vào đối tượng của tôi được gọi là isCurrentlyForSale không phải là Tùy chọn, không phải Tạm thời và không được lập chỉ mục. Loại thuộc tính được đặt thành Boolean với giá trị mặc định NO.

Khi tôi tạo ra các tập tin lớp học từ mô hình dữ liệu, mã boilerplate gia tăng đối với tài sản trong tiêu đề .h này là:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

cùng với

@dynamic isCurrentlyForSale; 

trong .m tệp triển khai.

Tôi đã luôn làm việc với các boolean như BOOL đơn giản. Tôi đã đọc rằng tôi có thể sử dụng các phương pháp numberWithBoolboolValue của NSNumber, nhưng điều này có vẻ giống như một số mã phụ rất đáng lo ngại đối với một cái gì đó rất đơn giản.

@property trong tiêu đề có được thay đổi thành BOOL đơn giản không? Nếu vậy thì có gì để xem không?

Cảm ơn -John

Trả lời

2

phản ứng đơn giản: Không, bạn không thể thay đổi @property khai để trả lại một BOOL.

Mặc dù vậy, bạn có thể viết một số trình bao bọc đơn giản. Tôi muốn đổi tên các thuộc tính để currentlyForSale (có nghĩa là nó tạo ra currentlyForSalesetCurrentlyForSale:), và sau đó viết hai giấy gói:

- (BOOL) isCurrentlyForSale { 
    return [[self currentlyForSale] boolValue]; 
} 

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

Một setter cũng như thuộc tính phải có "is" trong đó. Đó là lý do tại sao '@ property' có cài đặt' getter = '. Và có bạn có thể có '@ property' được thay đổi thành BOOL bằng cách sử dụng các trình truy cập nguyên thủy là một phần của Dữ liệu cốt lõi. –

+0

@Marcus Vâng, tôi biết rằng người định cư không nên có 'Is' trong họ, nhưng tôi đặt nó vào bởi vì' setCurrentlyForSale: 'đã được CD lấy (và tôi biết' getter = 'và' setter = '. Và bạn đang nói rằng bạn chỉ có thể thay đổi 'NSNumber *' thành 'BOOL' trong tiêu đề và nó sẽ hoạt động?Điều đó chắc chắn sẽ làm tôi ngạc nhiên. –

30

Trong khi câu trả lời Dave DeLong của gần, bạn thực sự có thể làm điều này mà không cần phải thay đổi tên của bất động sản.

Bạn có thể thay đổi thuộc tính để trả về BOOL nhưng sau đó bạn cần viết phương thức truy cập bằng tay và khác với những gì Dave có trong phản hồi của mình.

đầu tiên của bạn @property nên được định nghĩa là:

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale; 

Sau đó, trong tập tin thực hiện của bạn, thay vì tuyên bố một tài sản @dynamic, tạo accessors trực tiếp.

- (BOOL)isCurrentlyForSale 
{ 
    [self willAccessValueForKey:@"currentlyForSale"]; 
    BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue]; 
    [self didAccessValueForKey:@"currentlyForSale"]; 
    return b; 
} 

- (void)setCurrentlyForSale:(BOOL)b 
{ 
    [self willChangeValueForKey:@"currentlyForSale"]; 
    [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"]; 
    [self didChangeValueForKey:@"currentlyForSale"]; 
} 

Với những người truy cập này, đối tượng của bạn sẽ xử lý quyền anh và bạn có thể truy cập nó dưới dạng giá trị nguyên thủy. Ngoài ra, một setter bắt đầu với setIs không phải là một ý tưởng tuyệt vời, do đó loại bỏ nó trong mã ví dụ.

+0

+1 ah, tôi nhận được những gì bạn đang nói bây giờ. Tôi nghĩ bạn ngụ ý rằng bạn có thể thay đổi '@ property' thành' BOOL' và không triển khai các phương thức tùy chỉnh. Là một sang một bên, setter là hơi không chính xác. '(Sẽ | đã làm) ChangeValueForKey:' chỉ nên được gọi nếu giá trị mới thực sự khác (nghĩa là, bạn cần một câu lệnh if). –

+0

Ví dụ và giải thích tuyệt vời - cảm ơn Marcus! –

+0

Điều duy nhất tôi muốn thêm, là tôi thích sử dụng hằng số NSString cho các tên khóa, nó tiết kiệm từ việc gặp rắc rối khi quay lỗi đánh máy sau này. 'NSString * const CurrentlyForSale = @" currentForSale ";' – Eric

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