无法将表达式的类型 int 转换为类型 void swift
Can not convert expression's type int to type void swift
我正在尝试一些 obj-c 代码 swift,这是我的 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];
我转换成swift代码:
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
处遇到错误。
我不明白这里有什么问题。
malloc return 类型是 Void *
,所以 machine[size] 需要一个 Void 类型。
你需要使用
var machine = UnsafeMutablePointer<CChar>.alloc(size!+1)
分配 char* 指针
您的代码中有两个错误。 First(SolaWing 已经注意到),
分配的指针必须是指向 CChar
(又名 Int8
)的指针。
这可以用
来完成
var machine = UnsafeMutablePointer<CChar>.alloc(...)
或
var machine = UnsafeMutablePointer<CChar>(malloc(...))
Second,size
变量不能是可选的,而是一个初始化的
size_t
作为 inout 参数传递给 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 beta)编译。
在 Swift 1.1 (Xcode <= 6.2) 中,size_t
必须转换为 Int
在
var machine = [CChar](count: Int(size) + 1, repeatedValue: 0)
machine[Int(size)] = 0
我正在尝试一些 obj-c 代码 swift,这是我的 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];
我转换成swift代码:
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
处遇到错误。
我不明白这里有什么问题。
malloc return 类型是 Void *
,所以 machine[size] 需要一个 Void 类型。
你需要使用
var machine = UnsafeMutablePointer<CChar>.alloc(size!+1)
分配 char* 指针
您的代码中有两个错误。 First(SolaWing 已经注意到),
分配的指针必须是指向 CChar
(又名 Int8
)的指针。
这可以用
var machine = UnsafeMutablePointer<CChar>.alloc(...)
或
var machine = UnsafeMutablePointer<CChar>(malloc(...))
Second,size
变量不能是可选的,而是一个初始化的
size_t
作为 inout 参数传递给 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 beta)编译。
在 Swift 1.1 (Xcode <= 6.2) 中,size_t
必须转换为 Int
在
var machine = [CChar](count: Int(size) + 1, repeatedValue: 0)
machine[Int(size)] = 0