Невозможно преобразовать тип выражения int в тип void swift

Я пытаюсь выполнить быстрый код 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.

Я не понимаю, что здесь не так.


person Dharmesh Kheni    schedule 20.03.2015    source источник


Ответы (2)


В вашем коде две ошибки. Во-первых (как уже заметил SolaWing), выделенный указатель должен быть указателем на CChar (он же Int8). Это можно сделать с

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

or

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

Во-вторых, переменная size должна быть не опциональной, а инициализированной переменной size_t, которая передается как входной параметр в sysctlbyname():

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 вместо выделения памяти, это имеет то преимущество, что память освобождается автоматически:

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)

Приведенный выше код компилируется с помощью Swift 1.2 (бета-версия Xcode 6.3). В Swift 1.1 (Xcode ‹= 6.2) size_t необходимо преобразовать в Int в

var machine = [CChar](count: Int(size) + 1, repeatedValue: 0)

machine[Int(size)] = 0
person Martin R    schedule 20.03.2015

Тип возвращаемого значения malloc — Void *, поэтому машина [размер] ожидает тип Void.

вам нужно использовать

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

выделить указатель char*

person SolaWing    schedule 20.03.2015
comment
Спасибо за ваш ответ, но я получаю другую ошибку: Could not find an overload for '+' that accepts the supplied argument. - person Dharmesh Kheni; 20.03.2015