タイプAny?
の変数を保持/取得するジェネリッククラスを宣言したいが、要求時にこの変数を指定の型にキャストする。このo.value(forKeyPath: k)
がnil
とT
ときになるように、私は仕事にこれにたいジェネリック型のゼロを生成する方法
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) }
}
}
がnil
を保持することができます(それがExpressibleByNilLiteral
である)、(タイプT
の)v
戻りnil
ような何か。それは、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) }
}
}
のように見えますが、私はそれを動作させる方法がわからないです。
有効なT(ExpressibleByNilLiteralに準拠)がどのように見えるかを表示できますか? –
ドキュメントでは、「nilはSwiftで特定の意味を持っています。値がない場合、Optional型だけがExpressibleByNilLiteralに準拠します。他の目的でnilを使用する型のExpressibleByNilLiteral適合は推奨されません。 –
正しい(任意の) 'Optional'型は' ExpressibleByNilLiteral'に従います。 'init(nilLiteral:())'だけを必要とし、 'let n:T = E.init(nilLiteral:())を!と書くことができます。 (オプションのソースコードのコメントはこれを止めているようだが)。残念ながら、 'E.init(nilLiteral:())'は...であるため、これはクラッシュします。 'nil'と' as! 'は失敗します。これは、呼び出すことのできる何らかの種類の 'init'を提供するプロトコルで動作します。しかし、 'as! 'の実装は' 'ExpressibleByNilLiteral''と"エンタングル "されており、問題はそれらをどのように分けるかです。 – user3763801