0

statfsCの構造体には、次のchar配列メンバーがあります。

char f_mntonname[MNAMELEN];    /* directory on which mounted */
char f_mntfromname[MNAMELEN];  /* mounted file system */

モジュール内のこれらの配列の Swift 型Darwin.sys.mountは、90 個の要素を持つタプルです。

public var f_mntonname: (Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8,
                         ...
                         Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8)

C char 配列を文字列に変換することに関する別の質問には、この例で 2 回使用するコードによる回答があります。

import Darwin.sys.mount
var vols: UnsafeMutablePointer<statfs>?
let count = getmntinfo(&vols, 0)    
if let volsarray = vols, count > 0 {
    for i in 0 ..< count {
        var vol = volsarray[Int(i)]
        let mntOnName = withUnsafePointer(to: &vol.f_mntonname) {
            $0.withMemoryRebound(to: UInt8.self,
                                 capacity: MemoryLayout.size(ofValue: vol.f_mntonname)) {
                String(cString: $0)
            }
        }
        let mntFromName = withUnsafePointer(to: &vol.f_mntfromname) {
            $0.withMemoryRebound(to: UInt8.self,
                                 capacity: MemoryLayout.size(ofValue: vol.f_mntfromname)) {
                String(cString: $0)
            }
        }
        print("on \(mntOnName)  from \(mntFromName)")
    }
}

コードを 2 回繰り返さないように、変換コードを以下の関数にリファクタリングしましたが、関数に渡す&vol.f_mntonnameとコンパイルされず、最初の引数に別の型を使用して問題を解決する方法がわかりません。

func charArrayToString(_ array: UnsafePointer<Int8>, capacity: Int) -> String {
    return array.withMemoryRebound(to: UInt8.self, capacity: capacity) {
        String(cString: $0)
    }
}

var a = (Int8(65), Int8(66), Int8(67))
print(charArrayToString(&a, capacity: 3)) // doesn't compile

コンパイラは への呼び出しについて不平を言いますcharArrayToString:タイプ ' ' の値を期待される引数タイプ ' ' に変換
    できません(Int8, Int8, Int8)Int8

aの代わりに渡すと、それはまた不平を言います&a:タイプ ' ' の値を期待される引数タイプ ' ' に変換
    できません(Int8, Int8, Int8)UnsafePointer<Int8>

4

1 に答える 1