如何在Swift中创建一个NSMutableDictionary?

6
我正在尝试创建一个NSMutableDictionary来使用iOS中的钥匙串,但是我遇到了以下错误。
“找不到接受提供的参数的'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
    }
}

问题与您传递给字典的变量有关。您能展示它们的声明吗? - Mick MacCallum
既然这是一个NSDictionary的初始化方法,你可以尝试使用NSDictionary(objects:...,keys:...).mutableCopy()吗? - Jack
1
我明白了,问题应该出在参数上。你正在创建的数组类型是 Any[],但它需要 AnyObject[] 作为参数。我建议尝试用 NSValue 进行包装。我会在 Playground 中测试一下,并稍后起草答案。 - Jack
1
我已经将你的代码粘贴到了OS X playground中,它可以正常工作... - hamstergene
1
嗨,我正在使用Beta 2,但它不起作用。 - Farhad-Taran
显示剩余3条评论
1个回答

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接