2013-08-02 30 views
8

Tôi có một NSPredicate đơn giản mà không đem lại kết quả chính xácNSPredicate vấn đề với lớn hơn bằng

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.data.squareFootage >= %@", filterSquareFootage]; 
filteredArray = [[filteredArray filteredArrayUsingPredicate:resultPredicate] mutableCopy]; 

Công trình lạ mắt này cho tất cả 6000> = 250, 7000> = 250, 8000> = 6000. Nhưng ngay sau khi squareFootage == 10000 vị từ cho 10000> = bất kỳ giá trị nhỏ hơn nào là false. Lưu ý: 10000 cho squareFootage là giá trị lớn nhất được tìm nạp bằng UISlider.Nếu tôi giảm giá trị cho bất kỳ giá trị nhỏ hơn nào, thì biến vị ngữ cho đúng là kết quả

Tôi thiếu gì đó ở đây và sử dụng vị từ không chính xác?

+0

Bạn lưu trữ các giá trị như thế nào (loại dữ liệu, số/chuỗi/...)? – Wain

+0

@Wain - squarefootage được lưu trữ dưới dạng NSString một mô hình lớp phù hợp với NSCoding. – rawatm

Trả lời

22

tôi cho rằng tài sản của bạn được lưu giữ như chuỗi và không phải là số, do đó các giá trị được so sánh như dây đàn:

"10000" < "250" < "6000" 

Sử dụng NSNumber thay vì NSString (hoặc cách khác một số loại vô hướng như NSInteger) nên khắc phục sự cố.

Nếu bạn không thể thay đổi kiểu dữ liệu của các squareFootage tài sản, sau đó các ngữ sau đây nên làm việc:

[NSPredicate predicateWithFormat:@"SELF.data.squareFootage.intValue >= %d", [filterSquareFootage intValue]] 
+0

tôi đã thay đổi squarefootage và filtersquarefootage thành NSNumber với trình giữ chỗ trong vị ngữ vẫn là% @. Nhưng bây giờ cuộc gọi đến filterArrayUsingPredicate đang tăng [__NSCFNumber length]: bộ chọn không được nhận dạng được gửi tới trường hợp ngoại lệ. Bất kỳ ý tưởng gì xảy ra ở đây. – rawatm

+0

@ basstrekekr87: Điều này sẽ xảy ra nếu bất kỳ giá trị 'squareFootage' nào vẫn là NSString và không phải là NSNumber. –

+0

Cảm ơn rất nhiều. tôi quên xóa các giá trị cũ. nó hoạt dộng bây giờ. – rawatm

0

BẠN CÓ THỂ "T so sánh chuỗi SỬ DỤNG = < nếu SELF.data.squareFootage là. NSNumber cố gắng chuyển đổi bộ lọcSquareFootage thành NSnumber hoặc int value và so sánh chúng như thế.

+0

tôi đã chuyển đổi cả squareFootage và filterSquareFootage thành NSNumber (trình giữ chỗ trong vị ngữ là% @ cho NSNumber) nhưng bây giờ filterArrayUsingPredicate đang đưa ra một [__NSCFNumber length]: bộ chọn không được nhận dạng được gửi đến instance. – rawatm

+0

sử dụng% d thay vì% @ – Radu

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