使用从其他协议继承的协议作为关联类型

问题描述 投票:0回答:1

我正在尝试制作一个有两种相关类型的协议。这些相关类型之一是代表。当我尝试使用另一个协议作为关联类型时,我得到错误“类型'HostConnectionService'不符合协议'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

为了非协议类型,我不再收到错误:

struct NonProtocolConnectionServiceDelegate: ConnectionServiceDelegate { }

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

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

swift swift-protocols associated-types
1个回答
0
投票

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

它编译没有错误:

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
}

错误如下:

错误:类型'SomeClass'不符合协议'ProtocolB'

注意:可能意图匹配'SomeType'(又名'Protocol')不符合'Protocol'

这是因为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>()
© www.soinside.com 2019 - 2024. All rights reserved.