2017-01-17 15 views
5

Trong Swift chúng ta có thể viết phần mở rộng vào các mặt hàng chung chung như trình tự:chế Generic lồng nhau: Constrain T của một mục chung trong một phần mở rộng chuỗi chung đó là hạn chế để loại generic

extension Sequence where Iterator.Element : ObservableType { 

} 

Điều này sẽ đảm bảo phần mở rộng chỉ áp dụng cho các chuỗi (trong trường hợp này) các quan sát RxSwift.

Tuy nhiên, nếu ràng buộc phần tử là một chung chung khác thì bạn có thể hạn chế chung chung không? ví dụ .:

extension Sequence where Iterator.Element : ObservableType where E : MyType { 

} 

Trong mã giả trên (không hoạt động) mục đích là để nói:

Phần mở rộng này nên áp dụng đối với các chuỗi Quan sát nơi Quan sát là một quan sát được của loại MyType ví dụ [Quan sát]

Trả lời

2

Bạn có thể hạn chế Iterator.Element với các loại phù hợp với ObservableType và sau đó thêm khó khăn khác cho các loại hình liên quan đến E của Iterator.Element:

protocol ObservableType { 
    associatedtype E 
    // ... 
} 

class MyType { } 

extension Sequence where Iterator.Element: ObservableType, Iterator.Element.E: MyType { 

} 
+1

Đó không phải là hoàn toàn giống nhau mặc dù là nó? đó là hai ràng buộc trên phần tử trình tự? chứ không phải là một ràng buộc mà phần tử phải chung chung với một ràng buộc về những gì mà chung chung nên ở trong đó? Hoặc bạn có nghĩa là đoạn thứ hai sẽ là ObservableType.Element.E? (thử) – Cargowire

+0

@Cargowire: Mã trên hạn chế phần mở rộng đối với chuỗi các quan sát có kiểu liên quan kế thừa từ MyClass. Có lẽ tôi đang nhìn hoặc hiểu lầm điều gì đó - điều này khác với những gì bạn cần? Trong trường hợp nào nó sẽ không hoạt động như dự định? –

+1

gah bạn đúng, tôi đã hiểu sai về ràng buộc thứ hai chỉ là 'Iterator.Element' thay vì 'Iterator.Element.E'! – Cargowire

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