Swift协议需要属性作为协议

5 protocols swift

我正在尝试定义一个协议“存储库”,它需要定义几个属性(实现一个特定的协议“ DataSource”)

但是由于我的真实场景的复杂性,所以其中一个属性必须是“ DataSource”的子协议。

我将问题简化为以下简单代码:

protocol DataSource { }

protocol ExtraDataSouce: DataSource {
    func method1() -> String
}

struct MyDataSource: ExtraDataSouce {
    func method1() -> String {
        return "whatever"
    }
}


protocol Repository {
    var firstDataSource: DataSource { get }
    var secondDataSource: DataSource { get }
}

struct MyRepository: Repository {
    var firstDataSource: DataSource
    var secondDataSource: MyDataSource
}
Run Code Online (Sandbox Code Playgroud)

由于“ MyRepository”不符合“ Repository”,在编译时返回错误。但是我认为它确实可以...关于为什么它不接受定义为“ MyDataSource”的“ MyRepository”中的“ secondDataSource”的任何想法?

Rad*_*unu 2

您的存储库协议实现了 2 个 DataSource 类型的变量,当您尝试修改符合存储库协议的结构中的变量类型时,由于所需的类型,它不会让您执行此操作。您应该使用关联类型来进行此更改

protocol Repository {
    associatedtype type = DataSource
    var firstDataSource: DataSource { get }
    var secondDataSource: type { get }
}
Run Code Online (Sandbox Code Playgroud)