面对swift语言中的类型转换问题



我是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
}

最新更新