Swift コードから Security.framework の関数を呼び出そうとしています。次のように関数を呼び出すと、「エラー出力」(最後の)パラメーターを一瞬忘れてしまいます。
let accessControlRef = SecAccessControlCreateFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
SecAccessControlCreateFlags.UserPresence,
nil
)
次のエラーが表示されます。
タイプ '(CFAllocator!, CFStringRef, SecAccessControlCreateFlags, nil)' の引数リストを受け入れるタイプ 'SecAccessControlCreateFlags' の初期化子が見つかりません
...ただし、コードを次のように再フォーマットすると:
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence
let accessControlRef = SecAccessControlCreateWithFlags(
allocator,
protection,
flags,
nil
)
(特定の型- 例CFAllocatorRef
- Xcode のオートコンプリートの関数プロトタイプから取得)... 問題なくコンパイルされます。どうしたの?
次に、エラー パラメータ. 何を渡す必要がありますか?私のObjective-Cコードを移行すると、次の変数を渡したくなります(&
もちろん、先頭に が付きます):
var accessControlError:CFErrorRef! = nil
...エラーが発生します:
タイプ '(CFAllocatorRef!, AnyObject!, SecAccessControlCreateFlags, inout CFErrorRef!)' の引数リストで 'SecAccessControlCreateWithFlags' を呼び出すことはできません
代わりに、次の変数を渡します (ここでも、address-of 演算子を先頭に追加します)。
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?>
(プロトタイプのオートコンプリートで提案されているものと同じタイプ)、次のようになります。
タイプ '(CFAllocatorRef!, AnyObject!, SecAccessControlCreateFlags, inout UnsafeMutablePointer?>)' の引数リストで 'SecAccessControlCreateWithFlags' を呼び出すことはできません
...だから、何が得られますか?
EDIT:エラーパラメータを忘れてください。アドレスを 2 回取得しているようです (つまり、ポインターへのポインター)。代わりに、これを行う必要があります。
var accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'
let allocator:CFAllocatorRef! = kCFAllocatorDefault
let protection:AnyObject! = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.UserPresence
let accessControlRef = SecAccessControlCreateWithFlags(
allocator,
protection,
flags,
accessControlError // <- Notice the lack of '&'
)
出典:この回答内のサンプル コード。