Ajout d'un objet au trousseau en utilisant Swift

Je suis en train d'ajouter un élément à l'iOS de keychain de l'utilisation de Swift, mais ne peut pas comprendre comment le type cast correctement. À partir de la WWDC 2013 session 709, compte tenu de la suite de code Objective-C:

NSData *secret = [@"top secret" dataWithEncoding:NSUTF8StringEncoding];
NSDictionary *query = @{
    (id)kSecClass: (id)kSecClassGenericPassword,
    (id)kSecAttrService: @"myservice",
    (id)kSecAttrAccount: @"account name here",
    (id)kSecValueData: secret,
};

OSStatus = SecItemAdd((CFDictionaryRef)query, NULL);

Tenter de le faire en Swift comme suit:

var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var query: NSDictionary = [
    kSecClass: kSecClassGenericPassword,
    kSecAttrService: "MyService",
    kSecAttrAccount: "Some account",
    kSecValueData: secret
]

donne le message d'erreur "Impossible de convertir l'expression du type "Dictionnaire" à "DictionaryLiteralConvertible'.

Une autre approche que j'ai pris est d'utiliser Swift et la - setObject:forKey: méthode sur un Dictionnaire pour ajouter kSecClassGenericPassword avec la clé kSecClass.

En Objective-C:

NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary];
[searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];

Dans le code Objective-C, le CFTypeRef des différents trousseau classe de l'élément clés sont comblé à l'aide de l'id. Dans la Swift la documentation il est mentionné que Swift importations id AnyObject. Cependant lorsque j'ai voulu abattu kSecClass comme AnyObject pour la méthode, j'obtiens l'erreur "Type " AnyObject' n'est pas conforme à NSCopying.

Toute aide, si c'est une réponse directe ou quelques conseils sur la façon d'interagir avec les principaux types de Fondation serait appréciée.

EDIT 2

Cette solution n'est plus valable à compter de Xcode 6 Bêta 2. Si vous utilisez la version Beta 1 le code ci-dessous peuvent travailler.

var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let query = NSDictionary(objects: [kSecClassGenericPassword, "MyService", "Some account", secret], forKeys: [kSecClass,kSecAttrService, kSecAttrAccount, kSecValueData])

OSStatus status = SecItemAdd(query as CFDictionaryRef, NULL)

À utiliser Trousseau d'Attribut d'Élément clés, comme les clés de dictionnaire que vous avez à les déballer en utilisant takeRetainedValue ou takeUnretainedValue (selon le cas). Ensuite, vous pouvez les jeter à NSCopying. C'est parce qu'ils sont CFTypeRefs dans l'en-tête, qui ne sont pas copiable.

De Xcode 6 Bêta 2 toutefois, cela provoque Xcode pour crash.

source d'informationauteur Pasan Premaratne