Ошибка здесь:
copyfile_state_set(state, UInt32(COPYFILE_STATE_STATUS_CB), ©fileCallback)
потому что передает адрес переменной copyfileCallback
функции, а не самому указателю функции. В C вы можете передать произвольную функцию в качестве аргумента void *
. В Swift вы должны явно привести функцию к указателю:
let state = copyfile_state_alloc()
copyfile_state_set(state, UInt32(COPYFILE_STATE_STATUS_CB),
unsafeBitCast(copyfileCallback, to: UnsafeRawPointer.self))
И не забудьте в конце концов освободить память после операции копирования:
copyfile_state_free(state)
Примечание: В Swift рекомендуется использовать (тип наложения значения) URL
вместо NSURL
:
let srcURL = URL(fileURLWithPath: "Source_File_Path")
let destURL = URL(fileURLWithPath: "Destination_File_Path")
let result = srcURL.withUnsafeFileSystemRepresentation { srcFile in
destURL.withUnsafeFileSystemRepresentation { destFile in
copyfile(srcFile, destFile, state, flag)
}
}