[英]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
(如果您想返回Double
,則即使AnyObject
也不足夠擴展,因為Double
不是AnyObject
)。
這意味着您必須顯式調出let s : Any = ...
(因為Swift明智地不允許您隱式創建Any
),然后您將不得不通過某種方式進行Any
檢查。 完成后,您將對objectForKey()
充滿objectForKey()
。
即使可以使這種語法正常工作,也不應嘗試重載單個函數的語法來執行相反的操作。 這很令人困惑。 如果要構建這樣的擴展名,則應將其設為下標。 這樣,您將說defaults["key1"]
和defaults["key2"] = 2.01
。 也許可以構建一些東西(盡管仍然存在處理AnyObject?
所需的類型注釋問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.