2015-02-25 2 views
1

Я пытаюсь использовать токен доступа в Swift. Я загрузка маркеров, используя Locksmith так:Извлечение ценности от Слесаря ​​с SwiftyJson

let (dictionary, error) = Locksmith.loadDataForUserAccount("userAccount") 

Это возвращает следующее в консоли:

Optional({ 
    "access_token" = 123123123123123; 
}) 

Я использую SwiftyJSON для извлечения значения маркеров доступа

Я получаю следующее сообщение об ошибке:

'NSDictionary?' does not have a member named 'subscript' 

Любая идея, почему?

ответ

0

Как описано в вашем «NSDictionary»? Словарь является необязательным. Перед распаковкой stringValue вам необходимо развернуть свой опцион. Вы можете смело разворачивать его помощь, если позволить:

Редактировать

принимая намек от Ринтаро как было упомянуто его слесарная возвращает дополнительный словарь, так что вы должны сначала разворачивать свой словарь и их можно разворачивать access_token значения ключа

if let dictionary = dictionary { 
    if let access_token = dictionary["access_token"] as? Int { // or as? String 
     println(access_token) 
    } else { 
     println(false) 
    } 
} else { 
    println(false) 

} 

или если он возвращает [String: String] Словарь нет необходимости привести значение в строку

if let dictionary = dictionary { 
    if let access_token = dictionary["access_token"] { 
     println(access_token) 
    } else { 
     println(false) 
    } 
} else { 
    println(false) 

} 
+0

Интересно, все еще получая ту же ошибку. –

+0

Каков ваш тип NSDictionary? –

+0

Извините, что вам, вероятно, нужно отправить его в Int –

2

LOCKSMITH возвращает (NSDictionary?, NSError?):

public class func loadDataForUserAccount(userAccount: String, inService service: String = LocksmithDefaultService) -> (NSDictionary?, NSError?) 

Таким образом, в вашем случае dictionary сам Optional:

Try:

var access_token = dictionary?["access_token"] as? String 

Здесь access_token является String?, это может быть nil. Если вы хотите сохранить его в переменной AnyObject, вы должны развернуть его. Например, с помощью "Optional Binding":

if let token = access_token { 
    // Here, `token` is `String`, while `access_token` is `String?` 
    self.access_token = token 
} 

Или более прямо:

if let access_token = dictionary?["access_token"] as? String { 
    // Here, access_token is `String`, not `String?` 
    self.access_token = token 
} 
else { 
    // error handling... 
} 

Кстати, если вы хотите использовать SwiftyJSON, вы должны создать JSON объект из dictionary.

if let dict = dictionary { 
    var json = JSON(dict) 
    var access_token = json["access_token"].stringValue 
} 
+0

Теперь, когда я пытаюсь подключить это значение к параметрам, я получаю следующая ошибка: «String?'не идентичен «AnyObject» –

+0

«access_token» = 123123123123123 похоже, что он хранится как [String: AnyObject], но на самом деле это Int, иначе он будет «вокруг» –

+0

@LeonardoSavioDabus 'NSDictionary' строковое представление не является case: try 'println ([" access_token ":" 123 "] как NSDictionary)' – rintaro

Смежные вопросы