Я работаю над учебником OAuth, в котором для хранения токенов используется среда Locksmith. Учебник написан в более старой версии Swift, а также со старой версией фреймворка Locksmith. При воссоздании примера в Swift 4 я заметил, что Locksmith 4.0 использует обработку ошибок с блокировками do try catch. Я пытаюсь перевести необязательную привязку руководства в использование подхода обработки ошибок в рамках. Сначала я попробовал сам, но у меня возникли проблемы с установлением связи между тем, почему в учебнике используется необязательное связывание.
Вот выдержка из учебника:
var OAuthToken: String?
{
set
{
if let valueToSave = newValue
{
let error = Locksmith.saveData(["token": valueToSave], forUserAccount: "github")
if let errorReceived = error
{
Locksmith.deleteDataForUserAccount("github")
}
addSessionHeader("Authorization", value: "token \(newValue)")
}
else // they set it to nil, so delete it
{
Locksmith.deleteDataForUserAccount("github")
removeSessionHeaderIfExists("Authorization")
}
}
get
{
// try to load from keychain
let (dictionary, error) = Locksmith.loadDataForUserAccount("github")
if let token = dictionary?["token"] as? String {
return token
}
removeSessionHeaderIfExists("Authorization")
return nil
}
}
Вот что у меня есть. Я полагаю, что неправильно использую оператор catch в отношении необязательного связывания:
var OAuthTokenCompletionHandler: ((NSError?) -> Void)?
var authToken: String? {
set {
if let valueToSave = newValue{
do{
try Locksmith.saveData(data: ["token" : valueToSave], forUserAccount: "AzureMediaServices")
} catch {
//could not save the data into keychain
//handle the error somehow
try Locksmith.deleteDataForUserAccount(userAccount: "AzureMediaServices")
}
addSessionHeader("Authorization", value: "Bearer \(valueToSave)")
} else {
//try to set it to nil
removeSessionHeaderIfExists("Authorization")
}
}
get {
//TODO: implement
}
}