我正在尝试使用Swift将项目添加到iOS钥匙串,但无法弄清楚如何正确输入强制转换.从WWDC 2013会议709开始,给出以下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);
Run Code Online (Sandbox Code Playgroud)
尝试在Swift中执行如下操作:
var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var query: NSDictionary = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: "MyService",
kSecAttrAccount: "Some account",
kSecValueData: secret
]
Run Code Online (Sandbox Code Playgroud)
产生错误"无法将表达式的类型'Dictionary'转换为'DictionaryLiteralConvertible'.
我采用的另一种方法是使用Swift和- setObject:forKey:Dictionary上的方法来添加kSecClassGenericPassword和密钥kSecClass.
在Objective-C中:
NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary];
[searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
Run Code Online (Sandbox Code Playgroud)
在Objective-C代码中,使用id桥接各种keychain项类键的CFTypeRef.在Swift 文档中,提到Swift将id作为AnyObject导入.但是,当我试图将kSecClass转发为方法的AnyObject时,我得到的错误是"Type'AnyObject'不符合NSCopying.
任何帮助,无论是直接答案还是有关如何与Core Foundation类型交互的指导,都将受到赞赏.
编辑2
此解决方案从Xcode 6 Beta 2开始不再有效.如果您使用Beta 1,则以下代码可能有效.
var secret: NSData = …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个keychain查询,但我在使用Attribute Item Keys作为字典键时遇到了困难.在创建字典时,我可以将包含在数组中的属性项作为字典键传递,如此没有任何问题
genericPasswordQuery = NSMutableDictionary(objects: [kSecClassGenericPassword, identifier], forKeys: [kSecClass, kSecAttrGeneric])
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将另一个类似项添加到查询字典中,如下所示:
genericPasswordQuery.setObject(accessGroup, key:kSecAttrAccessGroup)
Run Code Online (Sandbox Code Playgroud)
它抱怨密钥不符合NSCopying并提供类型错误:
"无法找到接受所提供参数的'setObject'的重载"
这是SecItemAdd的标准实现,但我在Swift中遇到问题.