我正在尝试实现CFDictionaryGetValue(),如this appledoc清单3所示:
server = CFDictionaryGetValue(credentialDict, kSecAttrServer);
userName = CFDictionaryGetValue(credentialDict, kSecAttrAccount);
password = CFDictionaryGetValue(credentialDict, kSecSharedPassword);
我实施了这样的
let userName = CFDictionaryGetValue(credentialDict, kSecAttrAccount)
let password = CFDictionaryGetValue(credentialDict, kSecSharedPassword)
但是我得到错误“无法调用”CFDictionaryGetValue“带有类型的参数列表”(CFDictionaryRef,CFStringRef)“
我不明白这与苹果医生如何实施它有何不同。
感谢
答案 0 :(得分:4)
是的,雷达here
中提到的代码存在问题我找到了一个解决方法:
let unsafeCred = CFArrayGetValueAtIndex(credentials, 0)
let credential: CFDictionaryRef = unsafeBitCast(unsafeCred, CFDictionaryRef.self)
let dict: Dictionary<String, String> = credential as! Dictionary<String, String>
let username = dict[kSecAttrAccount as String]
let password = dict[kSecSharedPassword.takeRetainedValue() as! String]
<强>更新强>
SecRequestSharedWebCredential("www.reddit.com", .None) {
credentials, error in
if CFArrayGetCount(credentials) > 0 {
let dict = unsafeBitCast(
CFArrayGetValueAtIndex(credentials, 0),
CFDictionaryRef.self) as Dictionary
let username = dict[kSecAttrAccount as String]
let password = dict[kSecSharedPassword as String]
login(username, password)
}
}
请注意区别:
iOS8上
var kSecSharedPassword: Unmanaged<AnyObject>!
func SecRequestSharedWebCredential(_ fqdn: CFString!,
_ account: CFString!,
_ completionHandler: ((CFArray!,
CFError!) -> Void)!)
iOS9
let kSecSharedPassword: CFString
func SecRequestSharedWebCredential(_ fqdn: CFString?,
_ account: CFString?,
_ completionHandler: (CFArray?, CFError?) -> Void)
以下是swift2 / iOS9 / xcode7
的所有changes答案 1 :(得分:0)
更新了XCode 7.3和Swift 2.2的答案
def _parse(form):
"""
Returns:
str:
"""
if sys.version_info > (3,):
# on Python 3 form needs to be byte encoded
encoded_form = []
for item in form:
try:
encoded_form.append(item.encode())
except AttributeError:
encoded_form.append(item)
return b'\r\n'.join(encoded_form)
return '\r\n'.join(form)
请记住在返回用户名和密码的值时要小心,因为它必须在主线程上