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
に基づいていましたが、そのすべてがどのように機能するのか理解できませんでしlength
たbytes
。Data
などのドキュメントを読んでみUnsafeMutablePointer
ましたが、あまり役に立ちませんでした。
誰かがこのコードを変換するのを手伝ってくれたら本当に感謝していますが、これをすべて理解するために正しい方向に私を向けるだけでも、すでに大きな助けになります. 他にどこを見ればいいのかわからず、そのすべてが本当に不可解に思えます。私が見つけた最近のいくつかの情報源は、私が知らないことをたくさん知っていると仮定しており、何を探すべきかさえ知りません.
ありがとう!