Переместите массив строк в 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. И я не нашел способа получить массив аргументов в память и получить правильный указатель на него.
Вещи, которые я пробовал:
- Попытка использовать 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?
- Попытка создать массив строк 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)
Опять же, непрозрачные указатели являются ключом к соединению различных типов, или я смотрю на это неправильно?
Любая помощь очень ценится!
Спасибо.