4

这对我来说似乎是有效的代码,但它不会解开元组

func updateUserDefaults<T>(data:T) {
    if let data = data as? (String, Any) {
        println(data.1)
    }
}

updateUserDefaults(("loop", true))

我的目标是使它成为 NSUserDefaults 的通用设置器。我使用泛型的原因是我可以在我的反应代码中轻松传递它,如下所示(接下来需要一个 T->() 函数:

loop.producer |> map { ("loop", $0) } |> start(next: updateUserDefaults)

更新:

似乎这似乎可行,它展开并可以作为 T->() 提供

func updateUserDefaults<T>(data:(String, T)) {
    if let value = data.1 as? Bool {
        userDefaults.setBool(value, forKey: data.0)
    } else if let value: AnyObject = data.1 as? AnyObject {
        userDefaults.setObject(value, forKey: data.0)
    }
    userDefaults.synchronize()
}
4

1 回答 1

2

您正在使用泛型函数,然后像类型参数一样访问参数。

当然你的功能应该是......

func updateUserDefaults(data: (String, Any)) {
    println(data.1)
}

updateUserDefaults(("loop", true))

使用泛型并不意味着它会自动知道您传入的数据的类型模式。

这意味着它不知道您传入的数据的架构,而且它不知道也不应该关心。

此外,该参数data不是可选的,因此不需要打开它。

您不能将泛型参数“解包”为已知类型。它不是那样工作的。

于 2015-07-07T12:43:53.593 回答