6

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 '&'
)

出典:この回答内のサンプル コード。

4

1 に答える 1

11

(OK、しばらくの間、誰も新しい洞察を追加していないので、最後の編集の内容で自分の質問に答えます:)

回答: error パラメータのことは忘れてください。アドレスを 2 回取得しているようです (つまり、ポインターへのポインター)。代わりに、これを行う必要があります。

let accessControlError:UnsafeMutablePointer<Unmanaged<CFError>?> = nil
// ^ Already a 'pointer'

let allocator:CFAllocator!         = kCFAllocatorDefault
let protection:AnyObject!             = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
let flags:SecAccessControlCreateFlags = SecAccessControlCreateFlags.userPresence 

let accessControlRef = SecAccessControlCreateWithFlags(
        allocator,
        protection,
        flags,
        accessControlError // <- Notice the lack of '&'
) 
于 2015-08-27T05:44:39.673 に答える