我正在尝试存储一个Integer并使用KeyChain对其进行检索。
这是我如何保存它:
func SaveNumberOfImagesTaken() { let key = "IMAGE_TAKEN" var taken = 10 let data = NSKeyedArchiver.archivedDataWithRootObject(taken) let query : [String:AnyObject] = [ kSecClass as String : kSecClassGenericPassword, kSecAttrAccount as String : key, kSecValueData as String : data ] let status : OSStatus = SecItemAdd(query as CFDictionaryRef, nil) }
这是我尝试检索它的方式:
func CheckIfKeyChainValueExitss() -> AnyObject? { var key = "IMAGE_TAKEN" let query : [String:AnyObject] = [ kSecClass as String : kSecClassGenericPassword, kSecAttrAccount as String : key, kSecReturnData as String : kCFBooleanTrue, kSecMatchLimit as String : kSecMatchLimitOne ] var dataTypeRef :Unmanaged<AnyObject>? let status: OSStatus = SecItemCopyMatching(query, &dataTypeRef) if let op = dataTypeRef?.toOpaque() { let data = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue() if let string: AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? AnyObject? { if key == "IMAGE_TAKEN" { return string as! String! } else if string == nil { return nil } } } return nil }
我收到以下错误:
无法将类型’__NSCFNumber’的值强制转换为’NSString’
我尝试使用变量,但没有成功。
好吧,我只是用光了源代码等,并做了自己的好帮手:尽情享受吧!
class func save(key: String, data: NSData) { let query = [ kSecClass as String : kSecClassGenericPassword as String, kSecAttrAccount as String : key, kSecValueData as String : data ] SecItemDelete(query as CFDictionaryRef) let status: OSStatus = SecItemAdd(query as CFDictionaryRef, nil) } class func load(key: String) -> NSData? { let query = [ kSecClass as String : kSecClassGenericPassword, kSecAttrAccount as String : key, kSecReturnData as String : kCFBooleanTrue, kSecMatchLimit as String : kSecMatchLimitOne ] var dataTypeRef :Unmanaged<AnyObject>? let status: OSStatus = SecItemCopyMatching(query, &dataTypeRef) if status == noErr { return (dataTypeRef!.takeRetainedValue() as! NSData) } else { return nil } } class func stringToNSDATA(string : String)->NSData { let _Data = (string as NSString).dataUsingEncoding(NSUTF8StringEncoding) return _Data! } class func NSDATAtoString(data: NSData)->String { var returned_string : String = NSString(data: data, encoding: NSUTF8StringEncoding)! as String return returned_string } class func intToNSDATA(r_Integer : Int)->NSData { var SavedInt: Int = r_Integer let _Data = NSData(bytes: &SavedInt, length: sizeof(Int)) return _Data } class func NSDATAtoInteger(_Data : NSData) -> Int { var RecievedValue : Int = 0 _Data.getBytes(&RecievedValue, length: sizeof(Int)) return RecievedValue } class func CreateUniqueID() -> String { var uuid: CFUUIDRef = CFUUIDCreate(nil) var cfStr:CFString = CFUUIDCreateString(nil, uuid) var nsTypeString = cfStr as NSString var swiftString:String = nsTypeString as String return swiftString } //EXAMPLES // // //Save And Parse Int // var Int_Data = KeyChain.intToNSDATA(555) // KeyChain.save("MAMA", data: Int_Data) // var RecievedDataAfterSave = KeyChain.load("MAMA") // var NSDataTooInt = KeyChain.NSDATAtoInteger(RecievedDataAfterSave!) // println(NSDataTooInt) // // // //Save And Parse String // var string_Data = KeyChain.stringToNSDATA("MANIAK") // KeyChain.save("ZAHAL", data: string_Data) // var RecievedDataStringAfterSave = KeyChain.load("ZAHAL") // var NSDATAtoString = KeyChain.NSDATAtoString(RecievedDataStringAfterSave!) // println(NSDATAtoString)