簡體   English   中英

如何產生一個通用類型的nil

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM