Last active
December 1, 2020 06:18
-
-
Save tempire/dc6960cd610a012914a8 to your computer and use it in GitHub Desktop.
swift array modification in loop
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// FAILURE | |
var array = [["name": "glen"]] | |
for item in array { | |
item["rank"] = "advanced" // Generates an @lvalue error | |
} | |
// Even though array is immutable, it's of type <Array<Dictionary<String,String>>, | |
// item is assigned by let automatically. | |
// FAILURE | |
var array = [["name": "glen"]] | |
for (var item) in array { | |
item["rank"] = "advanced" // Compiles, but with unexpected results | |
} | |
// item is now mutable, but the assignment is only on item, not array, | |
// because array is of type <Array<Dictionary<String,String>>, which is copy by value, | |
// so array remains unchanged. | |
// If array was full of objects (like NSDictionary), it would work, because then it would be copy by | |
// reference | |
// SUCCESS | |
var array = [["name": "glen"]] | |
for index in 0..<array.count { | |
array[index]["rank"] = "advanced" // Expected behavior | |
} | |
// This works because we are modifying array directly, not a copy of it's value. | |
// SUCCESS | |
var array = [["name": "glen"]] | |
for index in 0..<array.count { | |
array[index]["rank"] = "advanced" // Expected behavior | |
} | |
// This works because we are modifying array directly, not a copy of it's value. | |
// SUCCESS | |
// You could also use the enumerate function which returns a tuple, for the same outcome | |
var array = [["name": "glen"]] | |
for (index, (var item)) = enumerate(array) { | |
array[index]["event_date"] = "advanced" | |
} | |
// Note the use of (var item). Using item would have the same problem as above, a copy of the value in array. | |
// It's interesting to note that (var item) is a mutable copy of the value returned in the tuple. | |
// If item was used by itself, it would be immutable, or equivalent to (let item) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment