не удается добавить элемент в NSMutableDictionary в swift iOS

#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, например, из документации

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html