无法将表达式的int类型转换为void swift类型

时间:2015-03-20 05:16:20

标签: objective-c swift size-t

我正在尝试一些obj-c代码来快速,这是我的obj-c代码:

NSString *this_device = @"";
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size + 1);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
machine[size] = 0;
NSString *machineString = [NSString stringWithFormat:@"%s", machine];

我将其转换为快速代码:

 var this_device : NSString = ""
    var size : size_t?
    sysctlbyname("hw.machine", nil, &size!, nil, 0)
    var machine = malloc(size! + 1)
    sysctlbyname("hw.machine", machine, &size!, nil, 0)
    machine[size] = 0 //Can not convert expression's type 'int' to type 'Void'

但我在machine[size] = 0收到错误。

我不明白这里有什么问题。

2 个答案:

答案 0 :(得分:1)

malloc返回类型为Void *,因此machine [size]期望Void类型。

你需要使用

var machine = UnsafeMutablePointer<CChar>.alloc(size!+1)

分配char *指针

答案 1 :(得分:1)

您的代码中有两个错误。 首先(正如SolaWing已经注意到的那样), 分配的指针必须是指向CChar(又名Int8)的指针。 这可以通过

完成
var machine = UnsafeMutablePointer<CChar>.alloc(...)

var machine = UnsafeMutablePointer<CChar>(malloc(...))

第二个size变量不能是可选的,而是初始化的 {1}}变量作为inout参数传递给size_t

sysctlbyname()

或者,您可以创建一个Swift数组而不是分配内存, 这有利于内存自动释放:

var size = size_t(0)
sysctlbyname("hw.machine", nil, &size, nil, 0)
var machine = UnsafeMutablePointer<CChar>(malloc(size + 1))
sysctlbyname("hw.machine", machine, &size, nil, 0)
machine[size] = 0
let machineString = String.fromCString(machine)!
free(machine)
println(machineString)

上面的代码用Swift 1.2(Xcode 6.3 beta)编译。 在Swift 1.1(Xcode&lt; = 6.2)中,var size = size_t(0) sysctlbyname("hw.machine", nil, &size, nil, 0) var machine = [CChar](count: size + 1, repeatedValue: 0) sysctlbyname("hw.machine", &machine, &size, nil, 0) machine[size] = 0 let machineString = String.fromCString(machine)! println(machineString) 必须转换为size_t

Int