ios – Swift将泛型类型限制为Type

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

如果我有课:

class SomeClass< T:SomeProtocol> {}

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

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

最佳答案 AFAIK, Swift不允许您使用元类型作为泛型类型. (我相信这与Sam Giddins wished for in Swift 3的内容一致.)

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

protocol SomeProtocol {
    static func foo()
}

struct Concrete: SomeProtocol {
    static func foo() {
        print("I am concrete")
    }
}

class SomeClass {
    let T: SomeProtocol.Type

    init(T: SomeProtocol.Type) {
        self.T = T
    }

    func go() {
        T.foo()  // no need for dynamicType
    }
}

SomeClass(T: Concrete.self).go()

如果你说,你的协议只包含静态方法,那么这就足够了.但是,如果您需要将通用参数绑定到该类型,那也是可能的:

class SomeClass<U: SomeProtocol> {
    let T: U.Type

    init(T: U.Type) {
        self.T = T
    }

    func go(value: U) {
        T.foo()
    }
}

SomeClass(T: Concrete.self).go(Concrete())
点赞