2013-06-30 21 views
6

Tôi đã đọc: Collection Accessor Patterns for To-Many Properties, nhưng tôi không chắc mình có thể hoặc nên sử dụng ở đâu. Có thể ai đó vui lòng chỉ ra một số tình huống mà tôi có thể sử dụng Collection Accessor Patterns for To-Many Properties để làm cho mã của tôi tốt hơn hoặc làm cho mã của tôi viết dễ dàng hơn?Objective-c KVC: Bộ sưu tập mẫu Accessor dành cho nhiều thuộc tính, làm thế nào tôi có thể sử dụng nó để nâng cao mã của tôi?

Trả lời

3

Mẫu truy nhập bộ sưu tập mà bạn đang đọc về cải thiện cách mã hóa giá trị khóa hoạt động với bộ sưu tập như NSArray, NSDictionary, v.v. Nếu bạn triển khai chúng trong lớp của riêng bạn, lớp học của bạn có thể được sử dụng với KVC các lớp học. Ví dụ: có thể bạn có một lớp học Flight chứa danh sách Passenger. Nhưng có lẽ những hành khách đó không được lưu trữ trong một NSArray, nhưng được lấy từ một cơ sở dữ liệu hoặc một cái gì đó. Nếu bạn thực hiện các phương pháp sau:

  • -countOfPassengers
  • -passengersAtIndexes:
  • -getPassengers:range:

sau đó mã sử dụng lớp học của bạn có thể sử dụng KVC để truy cập một cách hiệu quả trong danh sách hành khách. Ví dụ, bạn có thể nhận được một danh sách các hành khách thường xuyên số tờ (giả sử Passenger có một tài sản như vậy) như thế này:

NSArray *frequentFlyerNumbers = someFlight.passengers.frequentFlyerNumbers; 

Đó là công cụ khá tiện dụng - giúp bạn tiết kiệm từ việc phải lặp qua các bộ sưu tập và thu thập tất cả những tự mình. Nếu bạn không biết rằng bạn có thể làm điều đó với các bộ sưu tập tiêu chuẩn như NSArray, điều này có vẻ đáng ngạc nhiên, vì vậy hãy dành một phút để hấp thụ phần đó trước và sau đó xem xét việc thực hiện một vài phương pháp đơn giản mà bạn đã làm tương tự của riêng bạn Flight lớp học. Nó khá thú vị khi nó hoạt động mặc dù việc lưu trữ hành khách hoàn toàn nằm trong lớp của bạn.

Bây giờ, các phương pháp trên chỉ thu khí bìa, nhưng bạn có thể làm tương tự cho setters bằng cách thực hiện:

  • -insertPassengers:atIndexes:
  • -removePassengersAtIndexes:
  • -replacePassengersAtIndexes:withPassengers:

Bây giờ, một lần nữa, bạn mã có thể thêm và xóa hành khách khỏi chuyến bay bằng KVC:

[someFlight replacePassengersAtIndexes:bumpedPassengerIndexes 
         withPassengers:passengersFromLateConnectingFlight]; 

Có các bộ tiếp cận KVC khác mà bạn có thể thực hiện, nhưng tôi không nghĩ rằng tôi cần liệt kê tất cả cho bạn vì chúng ở ngay trong bài viết mà bạn đã liên kết. Vấn đề là mã hóa giá trị khóa là công cụ hữu ích được sử dụng ở một số địa điểm, và bằng cách thực hiện một số ít các phương thức bạn có thể làm cho các lớp của riêng bạn tuân thủ KVC.

+0

câu trả lời hay hơn , cảm ơn bạn. – CarmeloS

0

Có một số trường hợp thực sự tiện dụng! Dưới đây là một số ví dụ tự giải thích.

Giả sử bạn có một mảng giá bán cho cùng một mặt hàng và muốn biết giá trung bình.

NSNumber *averagePrice = [salesPrices valueForKeyPath:@"@avg.self"]; 

Nếu phương pháp này phức tạp hơn thì vẫn đáng ngạc nhiên ngắn gọn và thanh lịch. Giả sử bạn có một mảng giao dịch của các từ điển, mỗi từ điển có một "đối tượng" và "giá" chính. Bạn muốn tổng doanh thu cho táo.

NSArray *apples = [transactions filteredArrayUsingPredicate: 
    [NSPredicate predicateWithFormat:@"object = %@", @"apple"]]; 
NSNumber *totalApplesSales = [apples valueForKeyPath:@"@sum.price"]; 

Cũng vui lòng xem các ví dụ được đưa ra trong Hướng dẫn lập trình mã hóa giá trị khóa. Chúng cũng rất minh họa.

+0

Không sai, nhưng OP hỏi về các mẫu truy nhập bộ sưu tập trong khi câu trả lời của bạn dường như bao gồm các toán tử thu thập như '@ avg' và' @ sum'. Chúng không giống nhau. – Caleb

0

Để thêm vào điều này. Việc áp dụng chúng trong API lớp học của bạn cho phép lớp học của bạn tận dụng lợi thế của các hành vi mã hóa chung được thiết lập tương tự trong các bộ sưu tập Foundation.

Một ví dụ hữu ích sẽ là bộ sưu tập không có thứ tự. Bạn có thể thực hiện điều này để tất cả các thuộc tính công khai của lớp của bạn có thể truy cập được vì nó là một từ điển. allKeys sẽ trả về tên thuộc tính. allValues ​​sẽ trả về giá trị của các thuộc tính đó. instanceOfYourClass [aPropertyName] sẽ trả lại thuộc tính aPropertyName

Điều này sẽ cho phép lặp lại nhanh chóng và nội tâm. Việc thực hiện sẽ mất một số nỗ lực nhưng sẽ làm cho một lớp phù hợp độc đáo với KVC và KVO và thêm khả năng làm những điều đơn giản và thông minh với các ràng buộc là tốt.

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