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?
仍然需要类型注释头痛)。
我想实现一些代码,这样我就可以调用类似的东西:
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?
仍然需要类型注释头痛)。