非可复制类型与所有权转移实战
利用Swift 5.9+的~Copyable实现具有唯一所有权的资源类型,如文件句柄与GPU缓冲区。 · 难度:入门 · +10XP
非可复制类型与所有权转移实战
Swift引入~Copyable类型后,可以创建无法隐式复制的类型,强制使用移动语义。本教程将带你实现一个文件描述符包装器,通过deinit自动关闭文件,并利用borrowing和consuming关键字显式控制所有权转移。你将看到如何避免双重释放、如何处理借用检查错误,以及在集合中使用非可复制类型的方法。
struct FileDescriptor: ~Copyable {
private let fd: Int32
init(path: String) throws {
fd = open(path, O_RDONLY)
if fd == -1 { throw NSError() }
}
consuming func read() -> Data {
// 消费自身后无法再使用
defer { discard() }
var buffer = UInt8
read(fd, &buffer, 1024)
return Data(buffer)
}
deinit {
close(fd)
}
private mutating func discard() {}
}
func processFile() throws {
let file = try FileDescriptor(path: "/tmp/test.txt")
let data = file.read() // 文件所有权转移给read
// file 在此处不再可用
}