2014-06-27 10 views
6

मैं आईओएस में कुंजी श्रृंखला का उपयोग करने के लिए एक एनएसएमयूटेबल डिक्शनरी बनाने की कोशिश कर रहा हूं, लेकिन मुझे निम्न त्रुटि मिल रही है।स्विफ्ट में एनएसएमयूटेबल डिक्शनरी कैसे बनाएं?

'init' है कि आपूर्ति की बहस

यह स्वीकार करता है के लिए एक अधिभार है मैं कोड का उपयोग कर रहा नहीं मिल सका:

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' init विधि है, तो क्या आप 'NSDictionary (ऑब्जेक्ट्स: ..., चाबियाँ: ...)। MutableCopy()'? – Jack

+0

कृपया अपडेट देखें, मैंने अभी पूरा कोड शामिल किया है। @Jack wu दुर्भाग्यवश यह काम नहीं करता है – 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) 
संबंधित मुद्दे