快速使用通用协议

时间:2019-03-15 02:11:03

标签: swift covariance

为了快速发展,我制定了名为<div class="container"> <a class="logo">Logo</a> <p>Navigation links</p> </div> <div class="container"> <a class="logo absolute">Logo</a> <p>Navigation links</p> </div>Message的协议。

跟随一个真实的实现和一个模拟的实现。此处的代码:

Socket

我的期望:

由于我有两组套接字,我希望可以在模拟环境和真实环境之间切换环境,这对于开发和调试非常有用。

但是 VC中存在错误,这使我无法完成工作。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

class VC <T: Socket>{
    var socket: T
    // Error here: Protocol 'Socket' can only be used as a generic constraint because it has Self or associated type requirements

    init(with socket: T) {
        self.socket = socket
    }
    // The only way I know to solve this is using the codes below:
    // var socket: MockSocket = MockSocket()
}

let vc = VC(with: MockSocket())
let vc2 = VC(with: RealSocket())

答案 1 :(得分:0)

您可以使用另一个字段来存储实际消息,并通过计算值符合协议。无需关联类型。

protocol Socket {
    var messages: [Message] { get }
}

// Real implementation 
class RealSocket: Socket {
    var messages:[Message]{
        return realMessages
    }
    private var realMessages: [RealMessage] = []
}

// Mocks
class MockSocket: Socket {
    var messages:[Message]{
        return mockMessages
    }
    private var mockMessages: [MockMessage] = []
}

class VC {
    var socket: Socket = MockSocket()

}

答案 2 :(得分:0)

请勿尝试以这种方式使用通用协议。您可以使用普通协议,也可以使用一个类以获取继承,或者使用通用类(如果通用部分很重要)。但是具有通用关联类型的协议本身并不是类型。