Reputation: 753
As per Swift documentation both mutating and inout keywords are used to modify the value types from within a function. Is there any difference between "mutating" and "inout" and any special case where we need to use either of them.
Upvotes: 5
Views: 2538
Reputation:
inout:- It means that modifying the local variable will also modify the passed-in parameters. Without it, the passed-in parameters will remain the same value.
mutating:-The properties of value types cannot be modified within its instance methods by default. In order to modify the properties of a value type, you have to use the mutating keyword in the instance method.
Upvotes: 1
Reputation: 11140
For me I see difference just in places where they are used.
Parameter marked with inout
keyword allows you to pass your value to any method similary as reference
func square(inout num: Int) {
num = num * num
}
In contrast to it, method marked with mutating
keyword is used in type scope and allows you to change value itself from this method
extension Int {
mutating func square() {
self = self * self
}
}
Upvotes: 3
Reputation: 270890
mutating
marks a method. inout
marks a parameter. They are completely different things.
Methods marked with mutating
can mutate self
i.e. set properties of self
, reassign self
etc.
struct Foo {
var foo: Int
mutating func mutate() {
foo += 1 // this is mutating self
}
}
Parameters marked with inout
basically become var
variables, as opposed to let
constants. You can change them, and the changes will also reflect on the caller's side.
func f(_ x: inout Int) {
x = 10
}
var a = 1
f(&a)
print(a) // 10
Upvotes: 17
Reputation: 198314
Value types' instance methods cannot change the value type's properties (or value itself), unless they are marked as mutating
.
Functions of any kind cannot change their parameters (and have the change propagate outside the function) unless those parameters are marked as inout
.
They do a similar job, but in different contexts.
Upvotes: 2