を(私は値が実際にあるものを選ぶでしょう)UnsafeMutablePointer<UInt32>?
は、あなたがタイプT
(ないT
へのポインタ)の変数を宣言して、それを渡したいですinoutパラメータ(接頭辞&
)。
あなたの問題に固有のので、keyValPtr
を渡す方法も間違っています。
パラメータpasswordLength: UnsafeMutablePointer<UInt32>?
の場合は、タイプUInt32
の変数を宣言する必要があります。 passwordData: UnsafeMutablePointer<UnsafeMutableRawPointer?>?
の場合は、UnsafeMutableRawPointer?
の変数を宣言する必要があります。
残念ながら、これは重大な問題ではない可能性があります。スウィフトString
を直接UnsafePointer<Int8>?
に渡すと、UTF-8表現に基づいて長さを計算する必要があります。
あなたはこのような何か書く必要がある場合があります。
func getClientKey() {
var keyVal: UnsafeMutableRawPointer? = nil
var len: UInt32 = 13 //<- this value is ignored though...
let status = SecKeychainFindGenericPassword(
nil,
UInt32(serviceName.utf8.count), serviceName, //### Use `utf8.count`
UInt32(accountName.utf8.count), accountName, //### Use `utf8.count`
&len, //### to pass `UnsafeMutablePointer<UInt32>?`, declare a variable of `UInt32`.
&keyVal, //### to pass `UnsafeMutablePointer<UnsafeMutableRawPointer?>?`, declare a variable of `UnsafeMutableRawPointer?`.
nil
)
if status == noErr {
let keyData = Data(bytes: keyVal!, count: Int(len))
//### As noted in the API reference of `SecKeychainFindGenericPassword`,
// "You should use the SecKeychainItemFreeContent function to free the memory pointed to by this parameter."
SecKeychainItemFreeContent(nil, keyVal)
print(keyData as NSData)
print(String(data: keyData, encoding: .utf8) ?? "?")
} else {
//You should not silently ignore erros...
print("Error: \(status)")
}
}
'VARさlen:UInt32型= 13'をして、あなたの関数に'&len'を渡します。 – vacawama