#ios #swift #nsmutabledictionary
#iOS #swift #nsmutabledictionary
Вопрос:
Я хочу добавить следующие элементы в NSMutableDictionary, но я получаю следующую ошибку
could not find an overload for setObject that accepts the following arguments
import Security
var returnDictionary = NSMutableDictionary()
returnDictionary.setObject(anObject: kSecClassGenericPassword, forKey: kSecClass)
когда я перехожу к безопасности.в файле h показано, что атрибуты объявлены, как показано ниже:
var kSecClass: Unmanaged<AnyObject>!
var kSecClassGenericPassword: Unmanaged<AnyObject>!
Комментарии:
1. Вы не можете работать с неуправляемым. Вы должны немедленно отправить его
takeRetained
илиtakeUnretained
до того, как сможете что-либо с ним сделать.2. Также я могу порекомендовать вам не пытаться работать напрямую с NSMutableDictionary в Swift. Используйте словарь Swift и передайте его в Objective-C, когда закончите с ним.
3. спасибо, Мэтт, я хочу использовать их для установки пароля в связке ключей, я предположил, что kSecClass должен быть передан в качестве ключа для kSecClassGenericPassword для KeyChain? разве это не так?
4. Хорошо, я понимаю, что вы имеете в виду; вы не можете использовать AnyObject в качестве ключа в словаре Swift. Извините за это.
5. итак, означает ли это, что я должен использовать строку в качестве ключа для kSecClassGenericPassword? смогу ли я по-прежнему использовать связку ключей, если сделаю это таким образом?
Ответ №1:
Вам нужно будет передавать строки напрямую, т.Е. "class"
и "genp"
. Возможно, вы захотите отправить отчет об ошибке по этому поводу; Apple необходимо обеспечить более быстрое соединение с этими константами.
Комментарии:
1. спасибо, я предполагаю, что строки сопоставляются с атрибутами, kSecClass и т. Д., Как вы узнали, к чему относятся эти атрибуты, например, «класс», «genp», могу ли я где-нибудь их посмотреть?
2. Боюсь, я обманул и заглянул прямо в их души.
Ответ №2:
Объявление функции func setObject(anObject: AnyObject!, forKey aKey: NSCopying!)
где , anObject : строгая ссылка на объект поддерживается словарем. Вызывает исключение NSInvalidArgumentException, если значение anObject равно нулю. Если вам нужно представить нулевое значение в словаре, используйте NSNull .
aKey: ключ для значения. Ключ копируется (с использованием copyWithZone:; ключи должны соответствовать протоколу NSCopying). Вызывает исключение NSInvalidArgumentException, если aKey равно нулю. Если ключ уже существует в словаре, его место занимает объект anObject.
В вашем случае kSecClass не соответствует протоколу NSCopying, поэтому выдает ошибку.
Попробуйте использовать returnDictionary = NSMutableDictionary(objects: [kSecClassGenericPassword], forKeys: [kSecClass])
Также приведенный ниже код должен работать с использованием Swift с Cocoa и Objective-C
var kSecClassSwift: NSString = kSecClass.takeRetainedValue() as NSString
returnDictionary.setObject(accessGroup, forKey: kSecClassSwift)
Из-за ошибки в бета-версии Xcode 6 она сейчас не работает, я надеюсь, что в следующем выпуске Apple исправит это.
Комментарии:
1. Укажите ключ, который соответствует NSCopying , например: «SecClass» — это строка, которая соответствует NSCopying.
2. Я хочу использовать их для установки пароля в связке ключей, я предположил, что kSecClass должен быть передан в качестве ключа для kSecClassGenericPassword для KeyChain? разве это не так?
3. @Xerxes Попробуйте returnDictionary = NSMutableDictionary(объекты: [kSecClassGenericPassword], forKeys: [kSecClass])
4. Это работает только для одного элемента, но когда мне нужно передать несколько элементов, как мне нужно, происходит сбой: NSMutableDictionary = NSMutableDictionary(объекты: [kSecClassGenericPassword, service, UserAccount, dataFromString], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecValueData])
5. Объявите правильно, например: var keyChain: NSMutableDictionary = NSMutableDictionary(объекты: [kSecClassGenericPassword, service, UserAccount,dataFromString], forKeys: [kSecClass, kSecAttrService, kSecAttrAccount, kSecValueData])
Ответ №3:
Попробуйте использовать swift dictionary вместо objc dictionary, например, из документации