为了快速发展,我制定了名为<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中存在错误,这使我无法完成工作。
任何帮助将不胜感激。
答案 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)
请勿尝试以这种方式使用通用协议。您可以使用普通协议,也可以使用一个类以获取继承,或者使用通用类(如果通用部分很重要)。但是具有通用关联类型的协议本身并不是类型。