如何测试另一个swift泛型类型?

如何测试另一个swift泛型类型?,swift,generics,Swift,Generics,我有一些泛型类型类,但没有要测试的对象实例。我想做的是根据运行时类型改变函数的行为 class MyGenericUtility<SomeGenericClass> { func myFunction() { // so far I have tested "is", "==" and "===" if SomeGenericClass is SomeRealClass { println("some special

我有一些泛型类型类,但没有要测试的对象实例。我想做的是根据运行时类型改变函数的行为

class MyGenericUtility<SomeGenericClass> {

    func myFunction() {
        // so far I have tested "is", "==" and "==="
        if SomeGenericClass is SomeRealClass {
            println("some special stuff there")
        }
        println("some generic stuff as the name tells")
    }

}
类MyGenericUtility{
func myFunction(){
//到目前为止,我已经测试了“是”、“是”和“是”
如果某个GenericClass是某个RealClass{
println(“那里有些特别的东西”)
}
println(“名字告诉我们的一些通用的东西”)
}
}

不能直接使用泛型类型,与“is”比较时需要使用该类型的属性

类MyGenericUtility{
变量a:T
func myFunction(){
如果a是Int{
println(“那里有些特别的东西”)
}
println(“名字告诉我们的一些通用的东西”)
}
初始值(值:T){
a=值
}
}
let test=MyGenericUtility(值:5)
test.myFunction()
//输出:有一些特殊的东西
//一些通用的东西,正如名字所示
让test2=MyGenericUtility(值:“foo”)
test2.myFunction()
//输出:一些通用的东西,顾名思义

您可以使用SomeGenericClass.self==SomeRealClass.self作为

class MyGenericUtility<SomeGenericClass> {
    func myFunction() {
        if SomeGenericClass.self == SomeRealClass.self {
            print("SomeRealClass stuffs")
        } else if SomeGenericClass.self == String.self {
            print("String stuffs")
        }
    } 
}


let someRealUtility = MyGenericUtility<SomeRealClass>()
someRealUtility.myFunction()

let stringUtility = MyGenericUtility<String>()
stringUtility.myFunction()
类MyGenericUtility{
func myFunction(){
如果SomeGenericClass.self==SomeRealClass.self{
打印(“SomeRealClass内容”)
}如果SomeGenericClass.self==String.self,则为else{
打印(“字符串内容”)
}
} 
}
让someRealUtility=MyGenericUtility()
someRealUtility.myFunction()
设stringUtility=MyGenericUtility()
stringUtility.myFunction()

与在运行时进行测试不同,您通常应该在编译时使用受约束的扩展来处理此问题(假设Swift 2)。这样做可以避免任何不安全的
as强制转换

class MyGenericUtility<SomeGenericClass> {
}

// Special handling for `SomeRealClass`
extension MyGenericUtility where SomeGenericClass: SomeRealClass {
    func myFunction() {
        print("SomeRealClass stuffs")
    }
}

// Default handling for any unspecified class
extension MyGenericUtility {
    func myFunction() {
        print("Other stuffs")
    }
}

let someRealUtility = MyGenericUtility<SomeRealClass>()
someRealUtility.myFunction()

let stringUtility = MyGenericUtility<String>()
stringUtility.myFunction()
类MyGenericUtility{
}
//“SomeRealClass”的特殊处理`
扩展MyGenericUtility,其中SomeGenericClass:SomeRealClass{
func myFunction(){
打印(“SomeRealClass内容”)
}
}
//任何未指定类的默认处理
扩展MyGenericUtility{
func myFunction(){
打印(“其他资料”)
}
}
让someRealUtility=MyGenericUtility()
someRealUtility.myFunction()
设stringUtility=MyGenericUtility()
stringUtility.myFunction()

请注意,这是基于继承而非相等,因此
SomeRealClass
的任何子类都将获得
SomeRealClass
行为。

二进制运算符“==”不能应用于SomeRealClass.type和…
类型的操作数。您是否使用最新版本的Swift。最新的swift应该是可能的。我想是swift 1.2。Swift 2还在测试阶段,不是吗?在创建游乐场时,我没有选择任何Swift版本,我正在运行XCode 6.4。这只是Swift 2,不是吗?是的。它需要Swift 2。好吧,不过很好地使用了这些扩展功能。我在WWDC的会谈中忘记了它们。
class MyGenericUtility<SomeGenericClass> {
}

// Special handling for `SomeRealClass`
extension MyGenericUtility where SomeGenericClass: SomeRealClass {
    func myFunction() {
        print("SomeRealClass stuffs")
    }
}

// Default handling for any unspecified class
extension MyGenericUtility {
    func myFunction() {
        print("Other stuffs")
    }
}

let someRealUtility = MyGenericUtility<SomeRealClass>()
someRealUtility.myFunction()

let stringUtility = MyGenericUtility<String>()
stringUtility.myFunction()