[英]How to produce a nil of a generic type
我想聲明一個通用類,該類持有/獲取類型為Any?
的變量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!
而崩潰as!
。 是否有可能做到這一點?
對此的嘗試破解如下(由如何使通用類的計算屬性取決於類約束建議 )
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
}
}
我以為我已經嘗試過了,但是行不通...無論如何,現在我們可以全部替換as!
當我們不想崩潰到nil
,使用cast
進行調用,如果我們要轉換的類型可以接受它,例如在我的問題的getter中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.