SwiftXattrs

Swift 4.2 Version License Platform Carthage compatible

一个微框架,提供了一种更方便的方式来在 Swift 中读写文件的扩展属性 (xattrs)。

示例

为了获得最大的便利性,将常用的扩展属性定义为 Xattrs.Attributes 的扩展。

extension Xattrs.Attributes {
    static var authorName: Xattr<String> { return Xattr(name: "authorName") }
}

然后使用 Xattrs 的下标访问器来读写值。

// Type annotations added to clarify the API
let url: URL = // ... 
let xattrs = Xattrs(url: url)

let originalAuthor: String? = xattrs[.authorName]
print(originalAuthor)

let plagiarizer = "Karl-Theodor zu Guttenberg"
xattrs[.authorName] = plagiarizer
print(xattrs[.authorName]) // "Karl-Theodor zu Guttenberg" 

如果只需要快速更改或读取值,则无需保留轻量级的 Xattrs 对象。

Xattrs(url: url)[.authorName] = "John Doe"

不太方便的示例

Xattrs 下标将返回可选值,而不是引发错误。 如果需要更多控制,你可以这样做!

底层的访问器定义为 URL 的扩展。

let url: URL = // ...

do {
    let data = try url.extendedAttribute(forName: "com.apple.TextEncoding")
    // decode data etc.
} catch {
    print(error.localizedDescription)
}

扩展 Xattrs 以支持更多类型

Xattrs 类型定义了一个通用的下标,作为上述 URL 扩展的包装器。

你可以使用它作为序列化和反序列化你自己的类型的基础。

Xattrs 还带有用于 NSKeyedArchiver 的基于对象的编码和解码的包装器。 利用 API 的这一部分来处理任意对象非常简单。

extension Xattrs {
    public subscript(xattr: Xattr<Banana>) -> Banana? {
        get { return decode(xattrKey: xattr.name) }
        set { storeEncoded(xattrKey: xattr.name, value: newValue) }
    }
}

在 Swift 支持泛型下标(如 subscript<T>(xattr: Xattr<T>) -> T?)之前,我们必须使用扩展来定义所有支持的类型。

致谢

这一切的基础是 URL 上的扩展,由 Martin RStackOverflow 上的一个答案中编写。

代码许可

版权所有 (c) 2017 Christian Tietze。 根据 MIT 许可证分发。