2014-06-27 59 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) 
相关问题