簡體   English   中英

Swift中的通用類型作為返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM