具有关联类型的协议中的通用变量。错误?

时间:2016-11-02 15:18:49

标签: swift generics swift-protocols swift2.3 associated-types

我正在使用Xcode 7.3和Swift 2.3。我很难使用具有变量的关联类型的协议。看一下这个例子:

protocol SomeProtocol {}
class SomeProtocolImpl: SomeProtocol {}

protocol ProtocolWithAssociatedType {
    associatedtype T: SomeProtocol

    var variable: T { get }
}

class TestClass: ProtocolWithAssociatedType {

    var variable: SomeProtocol = SomeProtocolImpl()

}

由于某种原因,编译器显示错误: error image 怎么可能?难道我做错了什么?这是一个错误吗?一个已知的?

我尝试过的事情:

为该关联类型定义了类型:

class TestClass: ProtocolWithAssociatedType {
    typealias O = SomeProtocol
    var variable: SomeProtocol = SomeProtocolImpl()
}

都能跟得上。

改为使用的方法:

protocol SomeProtocol {}
class SomeProtocolImpl: SomeProtocol {}

protocol ProtocolWithAssociatedType {
    associatedtype T: SomeProtocol

    func someMethod() -> T
}

class TestClass: ProtocolWithAssociatedType {
    typealias T = SomeProtocol

    func someMethod() -> SomeProtocol {
        return SomeProtocolImpl()
    }

}

刚出现不同的错误: second error image

如何创建具有关联类型和变量的协议并避免此错误?

1 个答案:

答案 0 :(得分:2)

编译器需要符合T的{​​{1}}特定类型。

虽然这条线看起来正确

SomeProtocol

编译器遇到的问题是var variable: SomeProtocol 不是类型,它是协议。

最简单的解决方案,告诉编译器使用的类型

SomeProtocol

或者让它自己搞清楚。

var variable: SomeProtocolImpl = SomeProtocolImpl()