2014-09-29 2 views
0

Мое приложение сбой причиной него находит ноль, когда разворачивание:«если (пусть брелка = KeychainService.loadToken())» дает мне ожидаемую ошибку декларации

var keyChain:String = KeychainService.loadToken()! 

Так я пытаюсь сделать:

if (let keyChain = KeychainService.loadToken()){ 

} 

Но это дает мне ошибку: Ожидаемая декларация

Является ли это правильный способ сделать это? если не то, что я делаю неправильно?

В случае, если вы wan't, чтобы увидеть мой KeychainService класс:

// Identifiers 
let serviceIdentifier = "serviceIndentifier" 
let userAccount = "userAccount" 
let accessGroup = "accessGroup" 

// Arguments for the keychain queries 
let kSecClassValue = kSecClass as NSString 
let kSecAttrAccountValue = kSecAttrAccount as NSString 
let kSecValueDataValue = kSecValueData as NSString 
let kSecClassGenericPasswordValue = kSecClassGenericPassword as NSString 
let kSecAttrServiceValue = kSecAttrService as NSString 
let kSecMatchLimitValue = kSecMatchLimit as NSString 
let kSecReturnDataValue = kSecReturnData as NSString 
let kSecMatchLimitOneValue = kSecMatchLimitOne as NSString 

class KeychainService: NSObject { 

/** 
* Exposed methods to perform queries. 
* Note: feel free to play around with the arguments 
* for these if you want to be able to customise the 
* service identifier, user accounts, access groups, etc. 
*/ 
    internal class func saveToken(token: NSString) { 
     self.save(serviceIdentifier, data: token) 
    } 

    internal class func loadToken() -> NSString? { 
     var token = self.load(serviceIdentifier) 

     return token 
    } 

    /** 
    * Internal methods for querying the keychain. 
    */ 
    private class func save(service: NSString, data: NSString) { 
     var dataFromString: NSData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 

     // Instantiate a new default keychain query 
     var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, dataFromString], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecValueDataValue]) 

     // Delete any existing items 
     SecItemDelete(keychainQuery as CFDictionaryRef) 

     // Add the new keychain item 
     var status: OSStatus = SecItemAdd(keychainQuery as CFDictionaryRef, nil) 
    } 

    private class func load(service: NSString) -> NSString? { 
     // Instantiate a new default keychain query 
     // Tell the query to return a result 
     // Limit our results to one item 
     var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue]) 

     var dataTypeRef :Unmanaged<AnyObject>? 

     // Search for the keychain items 
     let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) 

     let opaque = dataTypeRef?.toOpaque() 

     var contentsOfKeychain: NSString? 

     if let op = opaque? { 
      let retrievedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue() 

      // Convert the data retrieved from the keychain into a string 
      contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) 
     } else { 
      println("Nothing was retrieved from the keychain. Status code \(status)") 
     } 

     return contentsOfKeychain 
    } 
} 

ответ

1

опускаем фигурные скобки:

if let keyChain = KeychainService.loadToken() { 
    ... 
} 
+0

Если я делать, как это он говорит мне, чтобы поставить ';' между if и let –

+0

Ваша функция loadToken() 'является функцией класса и относится к' self'. Но нет «я» без экземпляра класса. – zisoft

+0

Хорошо, но он работал вчера, он просто внезапно прекратил работу и потерпел крушение, потому что он вернулся ноль –

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