トップ 最新 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|

2017-05-29 [Swift]ポインタを引数に持つC言語の関数

先日の『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に設定される。

ここを理解していなくて間違えていた。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/Identifier - GitHub

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

トップ 最新 追記