swift - 如何生成泛型的 nil

标签 swift generics

我想声明一个泛型类,它持有/获取 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/

相关文章:

typescript - 在Typescript中,如何获取在工厂(ish)函数中实例化的类上的方法的通用返回类型

java - 重构通用的compareTo方法

Swift 语言静态还是动态调度?

swift - 在 Swift 中向 PFObject 添加用户指针

swift - UICollectionView viewForSupplementaryElementOfKind didSelect

ios - Swift:在不同设备上以编程方式查找元素的大小

c++ - 给定迭代器检索容器的比较函数

C# 编译器无法识别正在实现接口(interface)的类

c++ - unreachable-code 在 C++11 中,这可能是什么原因造成的?

swift - 如何为我的自定义 UIView 的属性设置动画?