iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
先日の『BUKURO.swift x AKIBA.swift 合同勉強会』で説明したコードは、withUnsafeMutablePointer(to:_:) の使用方法に間違いがあった。正しい記述内容が分かったので発表する。
withUnsafeMutablePointer(to:_:) は、ポインタを引数に持つC言語の関数をSwiftで利用するt目の総称型関数だ。
func withUnsafeMutablePointer(to arg: inout T, _ body: (UnsafeMutablePointer) throws -> Result) rethrows -> Result
正しい記述内容は、以下のとおり。
var valueQueryResult: AnyObject?
result = withUnsafeMutablePointer(to: &valueQueryResult) {
SecItemCopyMatching(valueQuery as CFDictionary, UnsafeMutablePointer($0))
}
渡したい変数valueQueryResultの型は、AnyObject? 。
withUnsafeMutablePointer()の引数toにポインタを渡す。
C言語の関数はクロージャ内で呼び出す。
この関数の戻り値は、クロージャの返した値を返す。クロージャ内のコードが式1つならその値を戻り値として返すので、SecItemCopyMatching() の戻り値は、resultに設定される。
ここを理解していなくて間違えていた。