Хотя преобразование Int8?
в указатель достаточно просто (просто разверните его и используйте оператор &
при передаче его в качестве аргумента), ваша реальная проблема заключается в том, что преобразование вашей строки в Int8
в первомместо это ошибка.Значение, которое возвращает Bundle.path(forResource:ofType:)
, будет представлять собой путь, который выглядит примерно так:
"/Applications/MyApp.app/Contents/Resources/Init.dat"
Тем временем вы пытаетесь преобразовать это значение в Int8
, который является целочисленным типом, который можетсохранить значения от -128 до 127, используя инициализатор, который принимает String
.Причина, по которой этот инициализатор возвращает необязательное значение, заключается в том, что не каждая строка будет содержать число от -128 до 127, поэтому, если строка является чем-то другим, вы получите nil
.
Строка, подобная "37"
или "-101"
будет преобразован правильно, но строка пути, подобная приведенной выше, всегда просто даст вам nil
.
Что вы действительно хотите здесь сделать, это преобразовать String
в строку C.Есть несколько различных способов сделать это, но я бы использовал функцию fileSystemRepresentation
URL
, например:
let url1 = appBundle.url(forResource: "Init", withExtension: "dat")! // instead of path
url1.withUnsafeFileSystemRepresentation { cPath in
// cPath here is an UnsafePointer<Int8> that you can pass to C APIs inside this block.
}
// Don't let cPath get out here or bad things will happen.
Обратите внимание, что вам нужно сделатьне позволяйте cPath
экранировать блок withUnsafeFileSystemRepresentation
здесь, поскольку он не определен как допустимый вне этой области.
Также обратите внимание, что из-за !
это приведет к аварийному завершению работы вашего приложения, еслиФайл Init.dat
на самом деле не существует внутри вашего приложения, поэтому вам лучше убедиться, что вы включили его.