Swift:检查泛型函数的返回类型

Swift:检查泛型函数的返回类型,swift,generics,return-type,typechecking,Swift,Generics,Return Type,Typechecking,我知道如何检查命名变量的类型-,如果var是T。但找不到如何检查泛型函数的假定返回类型 实时示例,处理SwiftyJSON,丑陋的解决方案: func getValue<T>(key: String) -> T? { let result: T // so ugly approach... if result is Bool { return json[key].bool as? T } if result is Int {

我知道如何检查命名变量的类型-
,如果var是T
。但找不到如何检查泛型函数的假定返回类型

实时示例,处理SwiftyJSON,丑陋的解决方案:

func getValue<T>(key: String) -> T? {
    let result: T // so ugly approach...
    if result is Bool {
        return json[key].bool as? T
    }
    if result is Int {
        return json[key].int as? T
    }
    if result is String {
        return json[key].string as? T
    }
    fatalError("unsupported type \(result.dynamicType)")
}
func getValue(键:String)->T?{
让结果:T//如此丑陋的方法。。。
如果结果是布尔{
返回json[key].bool为?T
}
如果结果为Int{
返回json[key].int作为?T
}
如果结果是字符串{
返回json[key]。字符串为?T
}
fatalError(“不支持的类型\(result.dynamicType)”)
}
寻找更优雅的方法。

这将有效:

func getValue<T>(key: String) -> T? {
    if T.self is Bool.Type {
        return json[key].bool as? T
    }
    if T.self is Int.Type {
        return json[key].int as? T
    }
    if T.self is String.Type {
        return json[key].string as? T
    }
    fatalError("unsupported type \(T.self)")
}

这样,您就可以在编译时发现错误,而不是在运行时发现致命错误。

感谢
T.self
!至于专业化,我不想重复这个函数,因为代码中有共同的逻辑。我通过协议扩展解决了这个问题:
func getValue(key: String) -> Bool? {
    return json[key].bool
}
func getValue(key: String) -> Int? {
    return json[key].int
}
func getValue(key: String) -> String? {
    return json[key].string
}