2017-08-10 3 views
0

Je suis en train de faire une application qui lit les informations système (sur MacOS) et je suis en mesure de lire CORDES sysctl comme ceci:sysctl Swift obtenir entier

func cpu() -> String { 
    var size = 0 
    sysctlbyname("machdep.cpu.brand_string", nil, &size, nil, 0) 
    var machine = [CChar](repeating: 0, count: Int(size)) 
    sysctlbyname("machdep.cpu.brand_string", &machine, &size, nil, 0) 
    return String(cString: machine) 

} 

mais quand j'essaie de lire des nombres entiers comme hw.cpufrequency comme si:

func cpuFreq() -> String { 
    var size = 0 
    sysctlbyname("hw.cpufrequency", nil, &size, nil, 0) 
    var machine = [CChar](repeating: 0, count: Int(size)) 
    sysctlbyname("hw.cpufrequency", &machine, &size, nil, 0) 
    return String(cString: machine) 

} 

Il retourne absolument rien, aucune idée?

Répondre

1

Votre code suppose que la valeur de retour sera une chaîne, mais ce n'est pas le cas; c'est en fait un nombre entier. Si vous regardez la page de manuel de sysctl (3) [tapez 'man 3 sysctl' dans le Terminal pour le voir], vous verrez que "hw.cpufrequency" retourne un int64_t en C, ce qui se traduit par un Int64 dans Swift . Donc, vous voulez lire la valeur dans un Int64, pas une chaîne. Vous pouvez le faire comme ceci:

func cpuFreq() throws -> Int64 { 
    var frequency: Int64 = 0 
    var size = MemoryLayout<Int64>.size 

    if sysctlbyname("hw.cpufrequency", &frequency, &size, nil, 0) != 0 { 
     throw POSIXError.Code(rawValue: errno).map { POSIXError($0) } ?? CocoaError(.fileReadUnknown) 
    } 

    return frequency 
}