2014-06-27 48 views
6

我想創建一個NSMutableDictionary在iOS中使用的關鍵鏈,但我得到以下錯誤。如何在Swift中創建一個NSMutableDictionary?

找不到「初始化」,接受所提供的參數

這個過載是代碼我使用:

var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword, service, userAccount, kCFBooleanTrue, kSecMatchLimitOne], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecReturnData, kSecMatchLimit]) 

任何想法可能是什麼造成的?

的完整代碼:

import UIKit 
import Security 

let serviceIdentifier = "MySerivice" 
let userAccount = "authenticatedUser" 
let accessGroup = "MySerivice" 

class KeychainService: NSObject { 

    class func saveToken(token: NSString) { 
     self.save(serviceIdentifier, data: token) 
    } 

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

     return token 
    } 

    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: [kSecClassGenericPassword, service, userAccount, dataFromString], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecValueData]) 

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

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

    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: [kSecClassGenericPassword, service, userAccount, kCFBooleanTrue, kSecMatchLimitOne], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecReturnData, kSecMatchLimit]) 

     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 
    } 
} 
+0

的問題是與您傳遞到字典中的變量做。你能展示他們的聲明嗎? –

+0

因爲這是'NSDictionary'初始化方法,你可以嘗試'NSDictionary(objects:...,keys:...)。mutableCopy()'? – Jack

+0

請參閱更新,我已經包含了整個代碼。 @傑克武沒有不幸的是,這不起作用 – Xerxes

回答

4

爲了您的代碼,你可以使用一個的NSDictionary這樣:

var keychainObjects = NSArray(objects:"\(kSecClassGenericPassword)", service, userAccount, dataFromString) 
    var keychainValues = NSArray(objects:"\(kSecClass)","\(kSecAttrService)", "\(kSecAttrAccount)","\(kSecValueData)") 
    let keychainQuery = NSDictionary(objects: keychainObjects, forKeys: keychainValues) 
相關問題