我有一个带有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)
泛型的要点是通常对参数进行操作,但是你没有给函数任何特定类型的参数实际做任何工作(因此无法推断出一个).
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)
| 归档时间: |
|
| 查看次数: |
16699 次 |
| 最近记录: |