0

Swift 2 では、拡張属性を操作するための NSURL 拡張機能があり、これには次のものが含まれていました。

func setAttribute(name: String, value: String) {
    let data = value.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    setxattr(self.path!, name, data.bytes, data.length, 0, 0)
}

func getAttribute(name: String) -> String? {
    let length = getxattr(self.path!, name, nil, 0, 0, 0)
    if length == -1 {
        return nil
    }
    let bytes = malloc(length)
    if getxattr(self.path!, name, bytes, length, 0, 0) == -1 {
        return nil
    }
    return (String(data: NSData(bytes: bytes, length: length),
        encoding: NSUTF8StringEncoding))
}

func attributes() -> [String : String]? {
    let length = listxattr(self.path!, nil, 0, 0)
    if length == -1 {
        return nil
    }
    let bytes = UnsafeMutablePointer<Int8>(malloc(length))
    if listxattr(self.path!, bytes, length, 0) == -1 {
        return nil
    }
    if var names = NSString(bytes: bytes, length: length,
        encoding: NSUTF8StringEncoding)?.componentsSeparatedByString("\0") {
            names.removeLast()
            var attributes: [String : String] = [:]
            for name in names {
                attributes[name] = getAttribute(name)!
            }
            return attributes
    }
    return nil
}

今、私はそれを Swift 3 に変換しようとしていますが、Xcode は不平を言い続けています。

最初の 2 つの関数を次のように変更しましたが、正しく行っているかどうかはわかりません。

func setAttribute(_ name: String, value: String) {
    let data = value.data(using: String.Encoding.utf8, allowLossyConversion: false)!
    setxattr(self.path, name, (data as NSData).bytes, data.count, 0, 0)
}

func getAttribute(_ name: String) -> String? {
    let length = getxattr(self.path, name, nil, 0, 0, 0)
    if length < 0 {
        return nil
    }
    guard let bytes = malloc(length),
        getxattr(self.path, name, bytes, length, 0, 0) >= 0 else {
            return nil
    }
    if getxattr(self.path, name, bytes, length, 0, 0) < 0 {
        return nil
    }
    return (String(data: Data(bytes: bytes, count: length),
        encoding: String.Encoding.utf8))
}

最初の関数でそこにキャストDataする必要がありますか? NSDataこれについてもっと良い方法はありますか?

そして、最後の関数は Xcode によって次のように変換されました。

func attributes() -> [String : String]? {
    let length = listxattr(self.path, nil, 0, 0)
    if length == -1 {
        return nil
    }
    let bytes = UnsafeMutablePointer<Int8>(malloc(length))
    if listxattr(self.path, bytes, length, 0) == -1 {
        return nil
    }
    if var names = NSString(bytes: bytes, length: length,
        encoding: String.Encoding.utf8)?.components(separatedBy: "\0") {
            names.removeLast()
            var attributes: [String : String] = [:]
            for name in names {
                attributes[name] = getAttribute(name)!
            }
            return attributes
    }
    return nil
}

しかし、私は得る

タイプ '(UnsafeMutableRawPointer!)' の引数リストでタイプ 'UnsafeMutablePointer' の初期化子を呼び出すことはできません

そして、私は何をすべきかわかりません。また、Xcode の変換は に固執しNSStringます。あそこ使えないのString

まだ明らかでない場合は、自分が何をしているのかわかりません(笑)。元のコードはthismallocに基づいていましたが、そのすべてがどのように機能するのか理解できませんでしlengthbytesDataなどのドキュメントを読んでみUnsafeMutablePointerましたが、あまり役に立ちませんでした。

誰かがこのコードを変換するのを手伝ってくれたら本当に感謝していますが、これをすべて理解するために正しい方向に私を向けるだけでも、すでに大きな助けになります. 他にどこを見ればいいのかわからず、そのすべてが本当に不可解に思えます。私が見つけた最近のいくつかの情報源は、私が知らないことをたくさん知っていると仮定しており、何を探すべきかさえ知りません.

ありがとう!

4

0 に答える 0