2016-05-11 28 views
12

Tại sao không hỗ trợ chuyển đổi kiểu trả về nhanh chóng trong các phương thức được xác định trong các giao thức? ví dụ:Phương sai hiệp phương sai kiểu trả về trong các phương thức giao thức

class Base { } 

class Derived : Base { } 

protocol Requirement { 
    var someVariable : Base { get } 
} 

struct MyStruct : Requirement{ 
let someVariable : Derived 
} 

Trình biên dịch có lỗi mà MyStruct không tuân thủ giao thức Yêu cầu. Theo tôi biết MyStruct đáp ứng tất cả các yêu cầu của LSP, vì vậy tôi tự hỏi tại sao điều này không được phép trong Swift?

Trả lời

0

Hãy tưởng tượng bạn có:

var requirement: Requirement? 

và bạn muốn gán một biến kiểu Base

let myBaseInstance = Base() 
requirement.someVariable = myBaseInstance 

Nếu bạn nhìn vào cấu trúc của bạn, điều đó sẽ không thể thực hiện, kể từ trường hợp của cơ sở không được kế thừa từ Derived.

Nói cách khác, điều này sẽ không thực hiện được (nhưng nó phải được thể theo định nghĩa của giao thức):

var requirement: Requirement? = MyStruct() 
requirement.someVariable = myBaseInstance //error 

Bạn nhận được một lỗi tại dòng 2 vì someVariable phải loại Derived, nhưng myBaseInstance chỉ thuộc loại Base và có thể không phù hợp với Derived.

0

Bối cảnh rất quan trọng ở đây, vì vậy tôi không biết nếu điều này sẽ giúp bạn có được những gì bạn muốn.

Câu trả lời của tôi là sử dụng associatedtype.

Bắt đầu với cùng thiết lập

class Base { } 
class Derived: Base { } 

Lần này, tôi sẽ xác định một loại trong các giao thức mà cần phải có một số loại Base.

protocol Requirement { 
    associatedtype KindOfBase: Base 
    var someVariable: KindOfBase { get } 
} 

Bây giờ bạn có được những gì bạn muốn.

struct MyStruct: Requirement { 
    let someVariable: Derived 
} 

struct MyStruct2: Requirement { 
    let someVariable: Base 
} 
Các vấn đề liên quan