Swift 中的通用类型作为 Return 值

Generic Type in Swift as Return Value

我想实现一些代码,这样我就可以调用类似的东西:

NSUserDefaults("key1", "value1")
let s = NSUserDefaults("key1") // "value1" expected
NSUserDefaults("key2", 2.01)
let s = NSUserDefaults("key2") // 2.01 expected

我有一些概念代码如下,但显然它不会起作用。所以我的问题是,有没有办法利用泛型的优势,而不是像 class func bool(key: String, _ v: Bool? = nil) -> Bool? 那样编写一系列函数?

extension NSUserDefaults {
    class func object<T: AnyObject>(key: String, _ v: T? = nil) -> T? {
        if let obj: T = v {
            NSUserDefaults.standardUserDefaults().setObject(obj, forKey: key)
            NSUserDefaults.standardUserDefaults().synchronize()
        } else {
            return NSUserDefaults.standardUserDefaults().objectForKey(key) as T?
        }
        return v
    }
}

你的语法最终会很糟糕。这行不能像写的那样工作:

let s = NSUserDefaults("key1") // "value1" expected

Swift 必须在编译时为 s 选择类型,而不是 运行 时。所以它可以在这里分配的唯一类型是 Any(如果你想 return Double 甚至 AnyObject 都不够扩展,因为 Double 不是 AnyObject).

这意味着你必须显式调用 let s : Any = ...(因为 Swift 明智地不会让你隐式创建 Any),然后你将结束一个 Any 你必须以某种方式进行类型检查。完成后,您将原路返回 objectForKey()

即使您可以使此语法正常工作,您也不应尝试重载单个函数语法来做相反的事情。这很令人困惑。如果您要构建这样的扩展,您应该将其设为下标。这样你就会说 defaults["key1"]defaults["key2"] = 2.01。这可能是可以构建的东西(尽管处理 AnyObject? 仍然需要类型注释头痛)。