2016-08-12 28 views
5

tôi có mã nhanh chóng:Swift giao thức thừa kế

import Foundation 

protocol ParentProtocol { 
    //stuff 
} 

protocol ChildProtocol:ParentProtocol { 
    //additional stuff 
} 

protocol FooProtocol { 
    var variable:ParentProtocol? { get } 
} 

class Foo:FooProtocol { 
    var variable:ChildProtocol? 
} 

Tôi đã có trình biên dịch báo lỗi: Type 'Foo' does not conform to protocol 'FooProtocol'

tôi biết, rằng theo FooProtocol, loại biến phải ParentProtocol loại. Mặt khác, ChildProtocol được kế thừa từ ParentProtocol, do đó, nó cũng là ParentProtocol

Có giải pháp nào để sử dụng kế thừa giao thức theo cách đó không?

+0

@ShadowOf vâng, cảm ơn. Giải pháp với các kiểu liên kết hoạt động như mong đợi: http://stackoverflow.com/a/38008288/824285 – somedev

+0

Liên quan: [Làm thế nào tôi có thể tạo một hàm có kiểu trả về lớp con phù hợp với một giao thức, trong đó một lớp cha được định nghĩa là kiểu trả về ?] (http://stackoverflow.com/questions/35094967/swift-how-can-i-make-a-function-with-a-subclass-return-type-conform-to-a-protoc) – Hamish

+1

Cũng liên quan (sự phù hợp và thừa kế của các kiểu dữ liệu): [Giao thức không phù hợp với chính nó?] (http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself), trích dẫn MartinR: s bình luận, _ " Ngay cả với 'giao thức P: Q {}', 'P' không phù hợp với' Q' "_. – dfri

Trả lời

2

Tôi tìm thấy giải pháp với các loại liên quan (https://stackoverflow.com/a/38008288/824285)

Trong trường hợp của tôi nó sẽ là:

protocol FooProtocol { 
    associatedtype T = ParentProtocol 
    var variable:T? { get } 
} 
+1

Lưu ý rằng trong lớp phù hợp với giao thức này, 'T' có thể trở thành bất kỳ kiểu nào trong thực tế, không chỉ' ParentProtocol' hoặc nó là con, 'String' chẳng hạn. –

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