Swift ownership: borrowing, consuming, inout
Swift 5.9 introduced ownership modifiers for non-copyable types (~Copyable). Here’s the difference:
struct DBConnection: ~Copyable {
mutating func open() { /* ... */ }
mutating func close() { /* ... */ }
func query(_ sql: String) { /* ... */ }
}
borrowing - read-only access, caller keeps ownership:
func inspect(_ connection: borrowing DBConnection) {
connection.query("SELECT 1") // OK - read only
// connection.open() // Error - can't mutate
}
consuming - takes ownership, caller loses the value:
func runAndClose(_ connection: consuming DBConnection) {
connection.open()
connection.close()
// connection is destroyed here
}
runAndClose(db)
// db.query("...") // Error - db was consumed
inout - mutable borrow, caller keeps ownership:
func reopen(_ connection: inout DBConnection) {
connection.open() // OK - can mutate
}
// db still usable after call
Useful for modeling resources like DB connections, file handles, or locks where you want compile-time guarantees against use-after-close bugs.
Source: Proposal: SE-0390
← Back to DevLog