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 に答える