ios - SecAccessControlCreateWithFlags() in Swift -


i trying call function in security.framework, swift code. forgetting "error out" (last) parameter second, if call function this:

let accesscontrolref = secaccesscontrolcreateflags(             kcfallocatordefault,             ksecattraccessiblewhenunlockedthisdeviceonly,             secaccesscontrolcreateflags.userpresence,             nil         ) 

i ge tht efollowing error:

cannot find initializer type 'secaccesscontrolcreateflags' accepts argument list of type '(cfallocator!, cfstringref, secaccesscontrolcreateflags, nil)'

...however, if reformat code following:

let allocator:cfallocatorref! = kcfallocatordefault  let protection:anyobject!     = ksecattraccessiblewhenunlockedthisdeviceonly  let flags:secaccesscontrolcreateflags = secaccesscontrolcreateflags.userpresence   let accesscontrolref = secaccesscontrolcreatewithflags(     allocator,     protection,     flags,     nil ) 

(specific types -e.g., cfallocatorref- taken function prototype on xcode's autocomplete)...it compiles no problem. what's going on?

next, the error parameter. should pass? migrating objective-c code, tempted pass following variable (prepended &, of course):

var accesscontrolerror:cferrorref! = nil 

...which gives error:

cannot invoke 'secaccesscontrolcreatewithflags' argument list of type '(cfallocatorref!, anyobject!, secaccesscontrolcreateflags, inout cferrorref!)'

if, instead, pass following variable (again, prepended address-of operator):

var accesscontrolerror:unsafemutablepointer<unmanaged<cferror>?> 

(same type suggested prototype autocomplete), get:

cannot invoke 'secaccesscontrolcreatewithflags' argument list of type '(cfallocatorref!, anyobject!, secaccesscontrolcreateflags, inout unsafemutablepointer?>)'

...so, gives?

edit: forget error parameter. seems taking address twice (i.e., pointer pointer). instead, should this:

var accesscontrolerror:unsafemutablepointer<unmanaged<cferror>?> = nil // ^ 'pointer'  let allocator:cfallocatorref!         = kcfallocatordefault let protection:anyobject!             = ksecattraccessiblewhenunlockedthisdeviceonly let flags:secaccesscontrolcreateflags = secaccesscontrolcreateflags.userpresence   let accesscontrolref = secaccesscontrolcreatewithflags(         allocator,         protection,         flags,         accesscontrolerror // <- notice lack of '&' ) 

source: sample code within this answer.

(ok, nobody has added new insights in while, answer own question contents of last edit:)

answer: forget error parameter. seems taking address twice (i.e., pointer pointer). instead, should this:

var accesscontrolerror:unsafemutablepointer<unmanaged<cferror>?> = nil // ^ 'pointer'  let allocator:cfallocatorref!         = kcfallocatordefault let protection:anyobject!             = ksecattraccessiblewhenunlockedthisdeviceonly let flags:secaccesscontrolcreateflags = secaccesscontrolcreateflags.userpresence   let accesscontrolref = secaccesscontrolcreatewithflags(         allocator,         protection,         flags,         accesscontrolerror // <- notice lack of '&' )  

Comments