您如何指定泛型类型参数只能是协议(或符合该协议的协议),而不是符合该协议的类?
例如:
import Foundation
@objc protocol MyProtocol {
var name: String { get }
}
@objc protocol MySubProtocol: MyProtocol {
func foo()
}
class MyImplementation: MySubProtocol {
var name: String
init(name: String) {
self.name = name
}
func foo() {
print("Foo! Name: \(self.name)")
}
}
class InterfaceMaker<T: MyProtocol> {
init() {}
func makeInterface() -> NSXPCInterface {
return NSXPCInterface(with: T.self) // Cannot convert value of type 'T.Type' to expected argument type 'Protocol'
}
func getProxy() -> T? {
// Some magic in here involving `NSXPCConnection.remoteObjectProxy`
}
}
InterfaceMaker<MySubProtocol>().makeInterface() // No error, as expected
InterfaceMaker<MyImplementation>().makeInterface() // No error, but should not work!
如何指定泛型类型参数应该是协议?
我想限制T
为仅符合(例如)的协议。但问题是,我不知道如何防止 T 成为一个类(例如)。MyProtocol
MySubProtocol
MyImplementation
我已经尝试过约束T.self
(我试图使用where T.self : Protocol
,但这导致了错误'self' is not a member type of 'T'
)。
那么如何指定T
必须是符合的协议MyProtocol
,而不是类?如果那不可能,我至少可以指定 T 应该是任何协议吗?如果我需要制作一个仅类协议也可以。
MySubProtocol
作为非泛型参数传递不是我想要的,因为我也希望能够将该协议用作InterfaceMaker.getProxy()
函数的类型。此外,让该函数简单地返回MyProtocol
(换句话说,InterfaceMaker
是非泛型的)也不是一种选择。
注意:要完全清楚,我需要T
成为协议的原因是我要将它传递给NSXPCInterface.init(with:)
,它需要 a Protocol
(可以通过SomeProtocol.self
if SomeProtocol
is获得@objc
)。这意味着SomeProtocol.self.Type
是或符合
如果这是不可能的,请给出完整的解释原因。还要提及是否有可能在未来的 Swift 版本中支持这一点。
编辑:另一种表述方式是T.self is AnyObject.Type
永远不应该是真的。我宁愿在编译时检查这一点,而不是运行时检查或断言。