2009-07-10 30 views
7

Tôi nghĩ rằng có một cách để nhanh chóng yêu cầu một số NSSet thăm dò các thành viên của nó và trả lại một số tiền nói một thuộc tính NSInteger trong mỗi đối tượng của nó, nhưng tôi rất có thể nhầm lẫn điều này với phía Mac OS X của sự vật. Điều này có tồn tại trong Cococa Touch không?Cách nhanh chóng để tổng hợp một thuộc tính của tất cả các đối tượng trong một NSSet?

Điều gần nhất tôi có thể tìm là objectEnumerator, nhờ đó tôi giả sử tôi có thể xoay qua từng đối tượng và tăng biến của riêng mình. Liệu cách tốt hơn có tồn tại?

+0

Bạn đang nói về NSArrayController arrangementObjects. @ Sum. ... đồ đạc? Tôi không chắc chắn làm thế nào để kết nối nó với NSSet và làm thế nào để có được tính của các thành viên lớp cụ thể ... Tôi sẽ hv để đọc lên trên đó. – stefanB

Trả lời

15

Nếu bạn đang cố gắng để tìm tổng của một tài sản nhất định (theIntegerPropertyToSum) cho mỗi thành viên của một mảng/lớp thiết có nguồn gốc từ đó là KVC-compliant (theSet), bạn có thể làm như sau:

NSNumber* theSum = [theSet valueForKeyPath:@"@sum.theIntegerPropertyToSum"]; 
+0

Điều này thật tuyệt! Ở đâu, btw, là nó tài liệu? Tôi không thể tìm thấy bất cứ điều gì trong/xung quanh định nghĩa của "valueForKeyPath:" trong tham chiếu giao thức KVC ... – Meltemi

+0

chúng được gọi là toán tử mã hóa giá trị khóa và tài liệu khó tìm ... http: // developer .apple.com/library/ios/# documentation/cocoa/conceptual/KeyValueCoding/Các bài viết/Bộ sưu tậpOperators.html –

+0

Mã này không bảo trì thân thiện và sẽ gây nhầm lẫn cho mọi người xuống dòng. –

-3

Tại sao không sử dụng mục tiêu đơn giản C (2)?

NSInteger theSum = 0; 
for (id obj in theSetOrArray) 
    theSum += obj.theIntegerPropertyToSum; 

Bất lợi: Nếu bạn muốn đếm các dòng, thì điều này sẽ lâu hơn. Có những nhược điểm khác - tôi tự hỏi điều gì sẽ xảy ra với phương thức KVC với các đối tượng không có thuộc tính 'theIntegerPropertyToSum' bắt buộc?

Lợi thế: Tôi sẽ đặt cược rằng các thử nghiệm về hiệu suất và gỡ lỗi này dễ dàng hơn. Thêm vào đó khi ai đó đọc mã của bạn trong một hoặc hai năm, họ sẽ biết điều gì đang xảy ra ở đây - cho dù họ đã từng nhìn thấy một dòng mục tiêu C hay không, điều này có vẻ như những gì đang thực sự xảy ra.

+2

Câu trả lời của bạn ngụ ý rằng bạn đã không sử dụng hoặc đọc tài liệu trên KVC - bạn có thể muốn đọc về nó trước khi nói rằng nó không nên được sử dụng. Trong ví dụ "mục tiêu đơn giản C (2)" của bạn, điều gì sẽ xảy ra khi theIntegerPropertyToSum không xác định, hoặc một giá trị của IntegerPropertyToSum là -1 và giá trị khác là 1,2? Nếu nó là nil thì sao? –

+0

Tôi sử dụng KVC mọi lúc - để giao diện người dùng giao tiếp với mã. Điểm bất lợi của [theSet valueForKeyPath: @ "@ sum.theIntegerPropertyToSum"] là một cấu trúc ngôn ngữ không hiển thị trong nháy mắt những gì đang diễn ra. Bất kỳ trình lập trình C# C, C# nào nhìn thấy câu lệnh valueForKeyPath sẽ không hiểu nó - và bị hút vào một bài học tốn thời gian để tìm ra một dòng mã nào. Không bao giờ sử dụng cấu trúc ngôn ngữ cụ thể trừ khi bạn cần chúng. Nhắc tôi về mã STL C++, không thể đọc được đối với tất cả các chuyên gia STL. –

+1

Có vẻ như bạn sử dụng KVO mọi lúc, chứ không phải KVC. –

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