我想声明一个泛型类,它持有/获取 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
(它是 ExpressibleByNilLiteral
),v
返回 nil
(T
类型)。实际上,它因 as!
而崩溃。可以这样做吗?
对此的尝试破解看起来像这样(由 How to make a computed property of a generic class depend on the class constraints )
class A<T> {
var o: NSObject!
var k: String!
var v: T {
get {
let x = o.value(forKeyPath: k)
if let E = T.self as? ExpressibleByNilLiteral.Type {
if let x = x { return x as! T }
let n: T = <nil of type T> <---- not sure what to put here
return n
} else {
return x as! T
}
}
set { o.setValue(newValue, forKeyPath: k) }
}
}
但我不确定如何让它工作。
最佳答案
不知道为什么,但这确实有效
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
}
}
我以为我已经尝试过了,但它没有用...无论如何,现在我们可以用 cast
替换所有 as!
调用,当我们不想崩溃时在 nil
上,如果我们要强制转换的类型可以接受它,例如在我的问题中。
关于swift - 如何生成泛型的 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492153/