簡體   English   中英

Swift將泛型類型限制為Type

[英]Swift restrict generic type to Type

如何將泛型類型限制為類型,而不是類型的實例?

如果我有課:

class SomeClass<T: SomeProtocol> {}

我如何能確保T只是一個實例AnyClass (這只是AnyObject.Type

我的協議只有靜態方法,為了調用那些方法我必須做instance.dynamicType.protocolMethod而我想做someType.protocolMethod

AFAIK,Swift不允許您使用元類型作為泛型類型。 (我相信這與Sam Giddins 在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())
protocol P {
    static func foo()
}
class A : P {
    static func foo() {
        print("A class")
    }
}
class B : P {
    static func foo() {
        print("C class")
    }
}

var type1 = A.self
var type2 = B.self

func check(cls: AnyClass)->Void {
    switch cls {
    case is A.Type:
        A.foo()
    case is B.Type:
        B.foo()
    default:
        break
    }
}

check(type1) // A class
check(type2) // C class

let i = Int.self         // Int.Type
let ao = AnyObject.self  // AnyObject.Protocol
let ac = AnyClass.self   // AnyClass.Protocol
let p = P.self           // P.Protocol
let f = check.self       // (AnyClass)->Void

編輯

protocol P {
    static func f()
}
class A : P {
    static func f() {
        print("A")
    }
}
class B : P {
    static func f() {
        print("B")
    }
}

func f(cls: P.Type) {
    cls.f()
}

f(A)  // A
f(B)  // B

class Test<T: P> {
    func foo() {
        T.f()
    }
}

Test<A>().foo() // A
Test<B>().foo() // B

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM