2016-03-11 14 views
5

Tôi đang cố gắng triển khai lại một lớp trong Swift, nhưng đã gặp sự cố. Mô hình của tôi là có một đối tượng đơn lẻ chuyển tiếp các phương thức trong một giao thức tới nhiều đối tượng khác.Bộ chọn chuyển tiếp tới nhiều đối tượng trong Swift

Tôi có một giao thức mà trông giống như:

@protocol AnalyticsProvider { 
@optional 

    - (void)showHomePage; 
    - (void)selectedMenuItem:(NSString *)item; 

    // ... 
    // 100 or so more methods :sigh: 
    // ... 

@end 

Ý tưởng được rằng tôi có thể gọi showHomePage trên một singleton và có nó chuyển tiếp đến nhiều đối tượng, mỗi người sẽ làm việc của riêng họ với thông điệp đó.

tôi sẽ cấu hình singleton khi khởi động như thế này:

[AppAnalytics sharedAnalytics] setProviders:@[ myFlurryProvider, myOmnitureProvider] ]; 

nơi myFlurryProvider và myOmnitureProvider là người thực hiện thực sự của giao thức AnalyticsProvider. Và sau đó trong bộ điều khiển quan điểm của tôi tôi sẽ có những dòng như thế này:

[[AppAnalytics sharedAnalytics] showHomePage]; 

này nên gửi phân tích trang web của sự kiện để cả hai Flurry và Adobe Omniture, ví dụ. Điều này hoạt động vì lớp AppAnalytics triển khai giao thức AnalyticsProvidernhưng không thực sự chứa mã cho bất kỳ phương thức nào.

Bằng cách thực hiện forwardInvocation: trong AppAnalytics tôi có thể chuyển tiếp các phương pháp cho từng nhà cung cấp ví dụ:

- (void)forwardImplementation:(NSInvocation *invocation) { 
    for provider in providers 
     if ([provider respondsToSelector:invocation.selector]) 
      [invocation performWithTarget:provider] 
} 

Bằng không thực hiện bất kỳ phương pháp trong AppAnalytics singleton tôi các cuộc gọi được Automagically truyền vào forwardImplementation: như một NSInvocation, nhưng vì AppAnalytics tuân theo giao thức tôi nhận được sự an toàn của trình biên dịch tại thời điểm gọi. giành chiến thắng. Nó khá quan trọng Tôi không phải thực sự thực hiện bất kỳ phương thức nào trong AppAnalytics vì có 100 trong số chúng và tôi không muốn mã lặp lại nhiều lần!

Bất kỳ ý tưởng nào về cách tốt để triển khai điều này trong Swift, cho rằng NSInvocation bị cấm!

Trả lời

-2

Tôi không chắc lớp nào có phương thức forwardImplementation hoặc danh sách dịch vụ đến từ đâu nhưng dường như việc cung cấp các triển khai mặc định (không làm gì) cho mỗi phương thức trong giao thức của bạn sẽ đạt được an toàn kiểu mà không yêu cầu phương thức thực sự được triển khai trong bất kỳ lớp nào tuân theo giao thức.

+0

Nó sẽ, nhưng có hơn 100 phương pháp trong giao thức (đó là phân tích cho một ứng dụng khá lớn) vì vậy tôi muốn tránh điều này nếu có thể! Danh sách dịch vụ được tạo trong ứng dụng đại biểu khi khởi động. ForwardInvocation là trong singleton, và nó hoạt động vì singleton không thực hiện _any_ của các phương thức giao thức để tất cả chúng kết thúc tại một nơi :) – deanWombourne

+0

PS Tôi đã chỉnh sửa câu hỏi của mình để làm cho nó rõ ràng hơn một chút (tôi hy vọng) dựa trên câu trả lời của bạn :) – deanWombourne

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