2015-07-07 2 views
4

Это, кажется, правильный код для меня, но это не разворачивать кортежБерем кортеж в быстром

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

updateUserDefaults(("loop", true)) 

моя цель состоит, чтобы сделать это родовое сеттер для NSUserDefaults. Причина, почему я использовать родовое так я могу передать его легко в моем реактивном коде как следует (рядом ожидает функция Т ->():

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

UPDATE:

кажется, что это похоже на работу, он разворачивает и может быть обеспечен при Т ->()

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() 
} 

ответ

2

Вы используете общую функцию, а затем получить доступ к пункту метр, как типизированный параметр.

Конечно ваша функция должна быть ...

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

updateUserDefaults(("loop", true)) 

При использовании дженериков это не означает, что он будет автоматически знать тип схемы данных, которые вы пройти в.

Это означает, что Безразлично» t знать схему данных, которые вы проходите, но также и то, что это не так и не должно волновать.

Кроме того, параметр data не является необязательным, поэтому его не требуется разворачивать.

Вы не можете «развернуть» общий параметр в известный тип. Это не работает.

+0

Проблема в том, что этот метод будет называться form, который принимает (T) ->(), и я обновляю свой вопрос для этого. Но когда я пытаюсь развернуть мое свойство данных, я проверяю, есть ли его кортеж, поэтому мой вопрос остается. –