Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift在通用in协议中的应用_Swift_Covariance - Fatal编程技术网

Swift在通用in协议中的应用

Swift在通用in协议中的应用,swift,covariance,Swift,Covariance,为了快速开发,我制定了名为Message和Socket的协议 接下来是一个真实的实现和一个模拟的实现。此处的代码: //Procotols 协议消息{ } 协议套接字{ 关联类型T:消息 var消息:[T]{get} } //实际执行 类RealMessage:Message{ } 类RealSocket:Socket{ 私有(设置)var消息:[RealMessage]=[] } //嘲弄 类MockMessage:Message{ } 类MockSocket:Socket{ 私有(设置)va

为了快速开发,我制定了名为
Message
Socket
的协议

接下来是一个真实的实现和一个模拟的实现。此处的代码:

//Procotols
协议消息{
}
协议套接字{
关联类型T:消息
var消息:[T]{get}
}
//实际执行
类RealMessage:Message{
}
类RealSocket:Socket{
私有(设置)var消息:[RealMessage]=[]
}
//嘲弄
类MockMessage:Message{
}
类MockSocket:Socket{
私有(设置)var消息:[MockMessage]=[]
}
VC类{
//此处错误:协议“套接字”只能用作一般约束,因为它具有自身或关联的类型要求
var socket:socket=MockSocket()
//我知道解决这个问题的唯一方法是使用以下代码:
//var socket:MockSocket=MockSocket()
}
我的期望:

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

但是VC中有一个错误阻止了我的成就


任何帮助都将不胜感激。

您可以这样做:

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())
VC类{
变量插座:T
//此处错误:协议“套接字”只能用作一般约束,因为它具有自身或关联的类型要求
初始化(带套接字:T){
self.socket=socket
}
//我知道解决这个问题的唯一方法是使用以下代码:
//var socket:MockSocket=MockSocket()
}
设vc=vc(带:MockSocket())
设vc2=VC(带:RealSocket())

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

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()

}

不要试图以这种方式使用通用协议。您可以使用普通协议或类来获得继承,或者如果泛型部分很重要,可以使用泛型类。但具有泛型关联类型的协议本身不是类型

复制的和许多其他的