Swift 将泛型类型限制为 Type

bar*_*dog 5 generics protocols ios swift

如何将泛型类型限制为类型,而不是类型的实例?

如果我有一堂课:

class SomeClass<T: SomeProtocol> {}

我怎样才能确保这T只是AnyClass(这只是AnyObject.Type)的一个实例

我的协议只有静态方法,为了调用这些方法,我必须做instance.dynamicType.protocolMethod而我想做someType.protocolMethod

Pau*_*ell 1

AFAIK,Swift 不允许您使用元类型作为泛型类型。(我相信这符合 Sam Giddins在 Swift 3 中所希望的。)

\n\n

但是,您可以将其用作值。而不是制作T类型参数,而是将其作为属性:

\n\n
protocol SomeProtocol {\n    static func foo()\n}\n\nstruct Concrete: SomeProtocol {\n    static func foo() {\n        print("I am concrete")\n    }\n}\n\nclass SomeClass {\n    let T: SomeProtocol.Type\n\n    init(T: SomeProtocol.Type) {\n        self.T = T\n    }\n\n    func go() {\n        T.foo()  // no need for dynamicType\n    }\n}\n\nSomeClass(T: Concrete.self).go()\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果,正如您所说,您的协议仅包含静态方法,那么这就足够了。但是,如果您需要将泛型参数绑定到类型,\xe2\x80\x99s 也是可能的:

\n\n
class SomeClass<U: SomeProtocol> {\n    let T: U.Type\n\n    init(T: U.Type) {\n        self.T = T\n    }\n\n    func go(value: U) {\n        T.foo()\n    }\n}\n\nSomeClass(T: Concrete.self).go(Concrete())\n
Run Code Online (Sandbox Code Playgroud)\n