簡體   English   中英

無法將表達式的類型int轉換為void swift類型

[英]Can not convert expression's type int to type 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時遇到錯誤。

我不明白這里出了什么問題。

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

你需要使用

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

分配char *指針

您的代碼中有兩個錯誤。 首先 (已經由SolaWing注意到),分配的指針必須是指向CChar的指針(又名Int8 )。 這可以用

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

要么

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

其次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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM