2014-06-27 18 views
6

iOS'ta anahtar zincirini kullanmak için bir NSMutableDictionary oluşturmaya çalışıyorum ancak şu hatayı alıyorum.Swift'de NSMutableDictionary nasıl oluşturulur?

ben kod kullanıyorum edilir verilen argümanlar

Bu

kabul ettiğini 'init' için bir aşırı bulunamadı:

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

bu neden olabilecek fikrin var mı?

tam kodu:

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

. Bildirimlerini gösterebilir misin? –

+0

Bu bir "NSDictionary" init yöntemi olduğundan, NSDictionary'ı deneyebilirsiniz (object: ..., keys: ...) mutableCopy() '? – Jack

+0

lütfen güncellemeye bakın, şimdi tüm kodu ekledim. @Jack wu ne yazık ki işe yaramıyor – Xerxes

cevap

4

o şekilde bir NSDictionary kullanabileceğiniz kodu için: Sorun Sözlüğe geçiyoruz değişkenlerle yapmaktır

var keychainObjects = NSArray(objects:"\(kSecClassGenericPassword)", service, userAccount, dataFromString) 
    var keychainValues = NSArray(objects:"\(kSecClass)","\(kSecAttrService)", "\(kSecAttrAccount)","\(kSecValueData)") 
    let keychainQuery = NSDictionary(objects: keychainObjects, forKeys: keychainValues) 
İlgili konular