⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

非可复制类型与所有权转移实战

利用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 在此处不再可用 }

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 177 篇
0 完成
🔥 0