Переместите массив строк в UnsafeMutablePointer<Unmanaged <CFString >>!

Я пытаюсь вызвать DADiskMountWithArguments с помощью Swift.

swiftfunc DADiskMountWithArguments(_ disk: DADisk, _ path: CFURL?, _ options: DADiskMountOptions, _ callback: DADiskMountCallback?, _ context: UnsafeMutableRawPointer?, _ arguments: UnsafeMutablePointer<Unmanaged<CFString>>!)

Моя проблема связана с массивом строк Swift, в UnsafeMutablePointer >! который является ожидаемым форматом ввода аргумента.

Из документов:

аргументы
Список параметров монтирования с нулевым символом в конце для передачи в /sbin/mount -o.

В Objective-C я выполнил тот же вызов, создав значение аргументов следующим образом:

NSArray *args = @[
            @"rdonly",
            @"noowners",
            @"nobrowse",
            @"-j",
        ];

CFStringRef *argv = calloc(args.count + 1, sizeof(CFStringRef));
CFArrayGetValues((__bridge CFArrayRef)args, CFRangeMake(0, (CFIndex)args.count), (const void **)argv);

DADiskMountWithArguments((DADiskRef)_disk, (__bridge CFURLRef)url, kDADiskMountOptionDefault, DiskMountCallback, (__bridge void *)(self), (CFStringRef *)argv);

Но я не успешно перенес этот метод на Swift. И я не нашел способа получить массив аргументов в память и получить правильный указатель на него.

Вещи, которые я пробовал:

  1. Попытка использовать CFArrayGetValues:
// Example arguments array
let arguments = ["rdonly", "noowners", "nobrowse", "-j"]

// Create an UnsafeMutableRawPointer and allocate the correct string size
let argsUnsafeMutableRawPointer = calloc(arguments.count + 1, MemoryLayout<CFString>.size)

// Convert the Mutable pointer to an Immutable one
let argsUnsafeRawPointer: UnsafeRawPointer? = UnsafeRawPointer.init(argsUnsafeMutableRawPointer)

// CFArrayGetValues expects an UnsafeMutablePointer<UnsafeRawPointer?>. I have an UnsafeRawPointer, but can't get it into an UnsafeMutablePointer<T>.
let argsUnsafeMutablePointer: UnsafeMutablePointer<UnsafeRawPointer?>! = ?

// Call CFArrayGetValues
CFArrayGetValues(arguments as CFArray, CFRangeMake(0, CFIndex(arguments.count)), argsUnsafeMutablePointer)

// Call DADiskMountWithArguments
DADiskMountWithArguments(self.diskRef, url, DADiskMountOptions(kDADiskMountOptionDefault), diskMountCallback, nil, ?)

Должен ли я использовать непрозрачный указатель для моста от UnsafeRawPointer к UnsafeMutablePointer?

  1. Попытка создать массив строк c (char **) без CFArrayGetValues. Но я не знаю, как бы я поступил так?
// Example arguments array
let arguments = ["rdonly", "noowners", "nobrowse", "-j"]

// Create an Unmanaged<CFString> from the arguments array
let argsUnmanagedCFString: Unmanaged<CFString> = ?

// Create an UnsafeMutablePointer<Unmanaged<CFString>>! from the argsUnmanagedCFString
let argsUnsafeMutablePointer: UnsafeMutablePointer<Unmanaged<CFString>>! = ?

// Call DADiskMountWithArguments
DADiskMountWithArguments(self.diskRef, url, DADiskMountOptions(kDADiskMountOptionDefault), diskMountCallback, nil, argsUnsafeMutablePointer)

Опять же, непрозрачные указатели являются ключом к соединению различных типов, или я смотрю на это неправильно?

Любая помощь очень ценится!

Спасибо.

0 ответов

Другие вопросы по тегам