如何将`Any?`转换为可能的可选泛型类型

时间:2019-01-21 15:19:16

标签: swift generics

我正在使用通用类型擦除,需要从字典中获取数据并恢复为正确的类型。我使用泛型来检查进入数据结构的数据是否正确,然后将其类型删除。

我尝试查看堆栈溢出中的某些选项以转换通用可选内容,但没有一个是正确的。过去我已经实现了这一点,但是忘记了如何做。

class Foo {
    private var data = [String: Any?]()

    func getData<STATE:State>(for state: STATE.Type) -> STATE.DATA_TYPE {
        // What do?
    }

    func set<STATE: State>(data: STATE.DATA, for state: STATE.Type) {
        self.stateData[state.stringRepresentation()] = data
    }
}

国家有static func stringRepresentation() -> String,这是字典中的键

我希望函数返回Any?或强制转换为nil STATE.DATA_TYPE或强制将其中的任何数据强制转换为STATE.DATA_TYPESTATE.DATA_TYPE也可以是可选的

1 个答案:

答案 0 :(得分:0)

我设法找到了代码和相应的文章来回答我的问题:How to produce a nil of a generic type

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
    }
}