【发布时间】:2018-03-02 17:37:00
【问题描述】:
我需要处理的对象不仅要符合协议,还要公开它们所遵循的 second 协议的类型。 (这适用于 NSXPCConnection,您不仅必须配置要代理的对象,还必须告诉它应该在该代理对象上公开哪个协议。)
我尝试了类似的方法:
protocol Conformer where Self : Conformer.P {
associatedtype P : Protocol
static var interface : P {get}
init(info: String)
}
func exposeOverXPC<T:Conformer>(_ _: T.Type) {
let c : NSXPCConnection = …
c.exportedInterface = NSXPCInterface(with: T.interface)
c.exportedObject = T(info:"foo")
}
但是会导致错误:
关联类型“P”只能与具体类型或泛型参数库一起使用
特别是我希望exposeOverXPC 只接受以下对象:
- 可以以特定方式初始化
- 拥有引用协议的静态属性
interface - 本身是否符合上述
interface
这是我卡住的最后一步,有什么办法可以完成吗?
【问题讨论】:
-
删除协议上的
where子句应该使代码可编译。它在你的设计中应该扮演什么角色? -
另请注意,您不能真正符合
Protocol实例,因为它实际上不是协议,它主要包含有关 Objective-C 协议的信息。 -
where 子句是(失败的)尝试强制执行我的#3 标准,确保类实际上符合它公开的接口。您可能已经找到了问题的核心,即 Swift 不喜欢针对
@interface Protocol : NSObject的实例测试一致性。有没有不同的方法来实现我的三个标准? -
我的直觉告诉我这是不可能的。 ObjC 中的协议一致性与 Swift 中的非常不同,
Protocol与protocol几乎没有关系。出于 XPC 的目的,您绝对可以遵守所需的协议,而无需正式声明该事实(过去通过“非正式协议”真正很常见,尽管现在不那么如此了)。您只需要在运行时响应所需的方法。这与 Swift 的协议理念完全不同。这是一个有趣的问题,但我不知道编译时强制是否可以解决。
标签: swift generics swift-protocols