针对泛型类型的Swift检查类型

moh*_*945 21 swift

我有一个带有1个参数的泛型函数,想要检查传递参数的类型和泛型类型.像这样的东西:

func generic<T>(parameter: AnyObject) -> Bool {
    if parameter is T {
        return true
    } else {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道怎么称呼它

generic<String>("Hello")
Run Code Online (Sandbox Code Playgroud)

给我一个编译错误:"不能明确地专门化泛型函数generic("Hello")

Air*_*ity 27

您无法告诉函数其通用占位符的类型是什么(与通用结构不同).它必须从上下文中推断它们,例如它的论点.

做你想做的事的一种方法是添加另一个与type相关的参数T.您可以使用所需类型的元类型,而不是传入虚拟值:

func generic<T>(parameter: AnyObject, type: T.Type) -> Bool {
    if parameter is T {
        return true
    } else {
        return false
    }
}

let o: AnyObject = "hello"
generic(o, String.self)    // true
generic(o, NSString.self)  // also true
generic(o, Int.self)       // false
Run Code Online (Sandbox Code Playgroud)

但是,我会问你,你认为你在这里取得了什么成就?你基本上只做is了一个功能:

o is String     // true
o is NSString   // true
o is Int        // false
Run Code Online (Sandbox Code Playgroud)

泛型的要点是通常对参数进行操作,但是你没有给函数任何特定类型的参数实际做任何工作(因此无法推断出一个).

  • 我认为你已经将它简化到了很明显你做你正在做的事情没有意义的地步. (6认同)

Bro*_*Han 11

检查泛型类型是否是哪个类.

protocol Some {}
class SomeClass: Some {}
class AClass: Some {}
func test(_ t: T) -> String {
    if T.self == SomeClass.self {
        return "Some Class"
    } else {
        return "Another Class"
    }
}

print(test(SomeClass())) // Some Class
print(test(AClass())) // Another Class
Run Code Online (Sandbox Code Playgroud)