我想声明一个持有/获取类型为> 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
可以保持T
(nil
),{{ 1}}返回ExpressibleByNilLiteral
(类型为v
)。事实上,它因nil
而崩溃。有可能这样做吗?
此处的尝试破解看起来像这样(建议用 How to make a computed property of a generic class depend on the class constraints)
T
但我不确定如何使其发挥作用。
答案 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
上崩溃时,如果我们所投射的类型可以采取它,例如在我的问题的吸气器。