我是Swift语言的新手。我正在尝试将下面的C++函数转换为Swift函数,如下所示。
C++函数:
int test(test_type type, request_info_t *request, size_t request_len)
{
size_t size = request_len;
int mib[] = {0,0,0,0,0};
int ret = sysctl(mib, 5, request, &size, NULL, 0)
return ret;
}
Swift功能:
func test( type: test_type, request: request_info_t, request_len: size_t) -> Int64
{
let size: Int = request_len
let mib: [Int]= [0, 0, 0, 0, 0]
let val: Int32 = sysctl(mib, 5, request, size, nil, 0)
return val
}
但我在sysctl((中遇到了以下问题。有谁能帮忙解决这个问题吗。
- 由于第一个参数mib导致的错误:无法将类型为"[Int]"的值转换为预期的参数类型"UnsafeMutablePointer?">
- 由于第三个参数请求导致错误:无法将类型为"Int"的值转换为预期的参数类型"UnsafeMutablePointer?">
- 由于第四个参数大小导致错误:无法将类型为"request_info_t"的值转换为预期的参数类型"UnsafeMutableRawPointer?">
- 首先,Swift中sysctl的第一个参数的类型是UnsafeMutablePointer (苹果平台的(C++中的
int等效于Swift中的Int32,而不是int,并将mib声明为Int32的数组且可变。
- 第二,Swift中sysctl的第三个参数的类型是UnsafeMutableRawPointer
将任意可变指针传递给UnsafeMutableRawPointer!,但是Swift中test的第二个参数被声明为request_info_t,而不是指针。它与C++中第二个参数的类型不匹配,它是request_info_t*——指向request_info_t的指针。将Swift中test的第二个参数声明为指向request_info_t的指针。
- 第三,sysctlin Swift的第四个参数的类型是UnsafeMutablePointer
将Int的inout参数(&(传递给UnsafeMutablePointer!。
- 第四,C++中测试的返回类型是int,正如前面所说的,它在Swift中的等价物是Int32
包含所有这些内容后,代码应该如下所示:
func test(type: test_type, request: UnsafeMutablePointer<request_info_t>, request_len: size_t) -> Int32 {
var size: Int = request_len
var mib: [Int32] = [0, 0, 0, 0, 0]
let val: Int32 = sysctl(&mib, 5, request, &size, nil, 0)
return val
}