gpt4 book ai didi

swift - 使用从另一个协议(protocol)继承的协议(protocol)作为关联类型

转载 作者:行者123 更新时间:2023-11-30 10:49:24 26 4
gpt4 key购买 nike

我正在尝试创建一个具有两种关联类型的协议(protocol)。这些关联类型之一适用于委托(delegate)。当我尝试使用另一个协议(protocol)作为关联类型时,收到错误“类型‘HostConnectionService’不符合协议(protocol)‘ConnectionService’”。我的代码写在下面:

protocol ConnectionService: class {
associatedtype Peer: Sharelist.Peer
associatedtype Delegate: ConnectionServiceDelegate
var connectedPeers: [Peer] { get }
var delegate: Delegate? { get }
}

protocol ConnectionServiceDelegate { }

// Error
class HostConnectionService: NSObject, ConnectionService {
typealias Peer = GuestPeer
typealias Delegate = HostConnectionServiceDelegate

var delegate: HostConnectionServiceDelegate?
var connectedPeers: [GuestPeer] = []
}

protocol HostConnectionServiceDelegate: ConnectionServiceDelegate { }

当我改变线路时

typealias Delegate = HostConnectionServiceDelegate

成为非协议(protocol)类型,我不再收到错误:

struct NonProtocolConnectionServiceDelegate: ConnectionServiceDelegate { }

// No Error
class HostConnectionSertice: NSObject, ConnectionService {
...
typealias Delegate = NonProtocolConnectionServiceDelegate
...
}

这是一个基本的 Swift 限制,还是我做错了什么?

最佳答案

你的例子太复杂了,难以理解。我试图简化它。

编译没有错误:

protocol ProtocolA {}

protocol ProtocolB {
associatedtype SomeType
}

class SomeClass: ProtocolB {
typealias SomeType = ProtocolA
}

let object = SomeClass()

但是下面的例子不再编译:

protocol ProtocolA {}

protocol ProtocolB {
associatedtype SomeType: ProtocolA
}

class SomeClass: ProtocolB {
typealias SomeType = ProtocolA
}

错误如下:

error: type 'SomeClass' does not conform to protocol 'ProtocolB'

note: possibly intended match 'SomeType' (aka 'ProtocolA') does not conform to 'ProtocolA'

这是因为protocols don't conform to themselves

在您的情况下,很可能需要制作类模板:

protocol ProtocolA {}

protocol ProtocolB {
associatedtype SomeType: ProtocolA
}

class SomeClass<T: ProtocolA>: ProtocolB {
typealias SomeType = T
}

extension Int: ProtocolA {}
extension Double: ProtocolA {}

let object1 = SomeClass<Int>()
let object2 = SomeClass<Double>()

关于swift - 使用从另一个协议(protocol)继承的协议(protocol)作为关联类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54977338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com