当我尝试获取我的keyChain值时,它返回一个包含以下内容的字符串:
Optional("[thing in the KeyChain]")
因此,我尝试使用循环删除“可选”:
var str = KeychainService.loadToken()
for(var i = 0; i < 9 ; i++)
{
str[i] = ""
}
但我得到一个错误:NSString没有名为“下标”的成员
KeychainService类:
import Foundation
import Security
let serviceIdentifier = "MySerivice"
let userAccount = "authenticatedUser"
let accessGroup = "MySerivice"
// Arguments for the keychain queries
let kSecClassValue = kSecClass.takeRetainedValue() as NSString
let kSecAttrAccountValue = kSecAttrAccount.takeRetainedValue() as NSString
let kSecValueDataValue = kSecValueData.takeRetainedValue() as NSString
let kSecClassGenericPasswordValue = kSecClassGenericPassword.takeRetainedValue() as NSString
let kSecAttrServiceValue = kSecAttrService.takeRetainedValue() as NSString
let kSecMatchLimitValue = kSecMatchLimit.takeRetainedValue() as NSString
let kSecReturnDataValue = kSecReturnData.takeRetainedValue() as NSString
let kSecMatchLimitOneValue = kSecMatchLimitOne.takeRetainedValue() as NSString
class KeychainService: NSObject {
/**
* Exposed methods to perform queries.
* Note: feel free to play around with the arguments
* for these if you want to be able to customise the
* service identifier, user accounts, access groups, etc.
*/
internal class func saveToken(token: NSString) {
self.save(serviceIdentifier, data: token)
}
internal class func loadToken() -> NSString? {
var token = self.load(serviceIdentifier)
return token
}
/**
* Internal methods for querying the keychain.
*/
private class func save(service: NSString, data: NSString) {
var dataFromString: NSData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
// Instantiate a new default keychain query
var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, dataFromString], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecValueDataValue])
// Delete any existing items
SecItemDelete(keychainQuery as CFDictionaryRef)
// Add the new keychain item
var status: OSStatus = SecItemAdd(keychainQuery as CFDictionaryRef, nil)
}
private class func load(service: NSString) -> String? {
// Instantiate a new default keychain query
// Tell the query to return a result
// Limit our results to one item
var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue])
var dataTypeRef :Unmanaged<AnyObject>?
// Search for the keychain items
let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
let opaque = dataTypeRef?.toOpaque()
var contentsOfKeychain: String?
if let op = opaque? {
let retrievedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue()
// Convert the data retrieved from the keychain into a string
contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding)
} else {
println("Nothing was retrieved from the keychain. Status code \(status)")
}
return contentsOfKeychain
}
}
我只是不想删除str周围的Optional东西,还是有更好的方法呢?
我从以下代码中获取了代码:
http://matthewpalmer.net/blog/2014/06/21/example-ios-keychain-swift-save-
query/
Optional("")
之所以得到,是因为未解开可选值。您需要!
在对象后面放一个,您将再也不会得到它Optional("")
了。我会向您显示代码,但您没有向我们显示该print()
语句。我在下面做了一些示例,尽管我没有尝试过,但我认为可以重现此问题。
var value:String?
value = "Hello, World"
print("The Value Is \(value)") // Prints "The Value Is Optional(Hello, World)"
print("The Value Is \(value!)")// Prints "The Value Is Hello, World"
我希望这能回答您的问题,或者至少可以为您指明正确的方向,只是问您是否需要更多信息或更好的例子。
问题内容: 假设我有这个JSON: 我正在尝试通过PHP: 我正在尝试获取成就的第一个“ id” 。 我该如何解决? 问题答案: 当您设置的第二个参数来,它会返回一个数组。 返回一个数组。
问题内容: 我正在连接到第三方API,并获取了很长的JSON字符串。我只需要一个值,但是它位于层次结构的深处。有没有一种简单的方法就可以完成整个过程?我环顾四周,但似乎没有轻松的事情。 这是我的示例: 我一直在尝试使用Gson,以便可以将此斑点作为JsonObject。我确定有一些简单的东西,像这样: 或至少是这样的: 但是它似乎不存在。 那么,有没有可以让我做到这一点的解析器? 问题答案: 这是
问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我想从URL获取值,以按ID从数据库中选择数据。我想要ID值。 例如,如果我打开数据库, 我想获取id = 12的值。 如果我打开,则 获取数据库中id = 7的值,依此类推。 我有一些代码: 问题答案: 网址: 码:
问题内容: 我有一个问题,我需要从中获得价值 任何想法? 问题答案: 是您要找的东西。它需要更多的“推动”来告诉它“获得此价值并将其还给我”。 我还要说您可能甚至不需要这样做。如果您在努力获取元素的属性,则最好这样做:
我从外部设备接收数据,并在手机上保存为文本文件。我的问题是——我需要从文本文件中获取值userID。值保存在标签中。例如 我正在尝试使用JSoup来归档这个,但我有一些复杂问题。 下面是我的代码: 提前感谢您的帮助:)
我是JMS新手,正在尝试使用Glassfish应用服务器执行我第一个JMS程序。 我在Glassfish管理控制台中创建了连接工厂[JMS/MyQueueFactory]和目标资源[JMS/MyQueue],如下所示: 以下是我的代码: 请让我知道我在这里错过了什么。 多谢了。