一个微框架,提供了一种更方便的方式来在 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
的扩展。
URL.extendedAttribute(forName:) throws -> Data
URL.setExtendedAttribute(data:forName:) throws
URL.removeExtendedAttribute(forName:) throws
let url: URL = // ...
do {
let data = try url.extendedAttribute(forName: "com.apple.TextEncoding")
// decode data etc.
} catch {
print(error.localizedDescription)
}
Xattrs
类型定义了一个通用的下标,作为上述 URL 扩展的包装器。
Xattrs.subscript(xattrKey: String) -> Data?
你可以使用它作为序列化和反序列化你自己的类型的基础。
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 R 在 StackOverflow 上的一个答案中编写。
版权所有 (c) 2017 Christian Tietze。 根据 MIT 许可证分发。