如何生成一个普通类型的零

时间:2017-01-05 18:29:06

标签: swift generics

我想声明一个持有/获取类型为> select last(value), time from location where device_id = 'x'; select last(value), time from network where device_id = 'x'; select last(value), time from usage where device_id = 'x'; name: location time last ---- ---- 1483640697584904775 3 name: network time last ---- ---- 1483640714335794796 4 name: usage time last ---- ---- 1483640783941353064 4 的变量的泛型类,但在请求时将此变量强制转换为给定类型。像这样的东西

Any?

我希望这可以工作,以便当class A<T> { var o: NSObject! var k: String! var v: T { get { return o.value(forKeyPath: k) as! T } set { o.setValue(newValue, forKeyPath: k) } } } o.value(forKeyPath: k)nil可以保持Tnil),{{ 1}}返回ExpressibleByNilLiteral(类型为v)。事实上,它因nil而崩溃。有可能这样做吗?

此处的尝试破解看起来像这样(建议用 How to make a computed property of a generic class depend on the class constraints

T

但我不确定如何使其发挥作用。

1 个答案:

答案 0 :(得分:1)

不确定原因,但这确实有效

func cast<T>(_ v: Any?)->T {
    if let E = T.self as? ExpressibleByNilLiteral.Type {
        if let v = v {
            return v as! T
        } else {
            return E.init(nilLiteral: ()) as! T
        }
    } else {
        return v as! T
    }
}

我以为我已经尝试了这个并且它无法正常工作......无论如何,现在我们可以用as!代替所有cast来电,当我们不想在nil上崩溃时,如果我们所投射的类型可以采取它,例如在我的问题的吸气器。