How to return a dictionary by reference in Swift?

Rage

In the following example, you can see that the dictionary in the myStruct instance is not returned by reference in the getDictionary() function. Therefore, any changes made to the returned dictionary is only made to the copy. How can you return the dictionary by reference?

 struct myStruct {
        func getDictionary() -> [Int:String] {
            return dictionary
        }
    
        private var dictionary = [1:"one"]
    
    }
    
    
    let c = myStruct()
    var sameDict = c.getDictionary()
    sameDict[2] = "two"
    
    print(c.getDictionary(), sameDict)

[1: "one"] [1: "one", 2: "two"]

gcharita

Because the Dictionary is a struct type, the only way to do this is by passing it in a function using inout keyword (indicates that the parameter will be changed) like this:

struct MyStruct {
    func getDictionary() -> [Int: String] {
        return dictionary
    }
    
    mutating func updateDictionary(block: (inout [Int: String]) -> Void) {
        block(&dictionary)
    }

    private var dictionary = [1:"one"]
}


var c = MyStruct()
c.updateDictionary {
    $0[2] = "two"
}

print(c.getDictionary())

Update: After modification of the copy inside the function, before the return, the modified copy WILL assign to the global variable. @AlexanderNikolaychuk and @matt pointed out that in the comments. The behavior can be seen if you run the following code in a Playground:

struct MyStruct {
    var some = 1
}

var myStruct = MyStruct() {
    didSet {
        print("didSet")
    }
}

func pass(something: inout MyStruct) {
    something.some = 2
    print("After change")
}

pass(something: &myStruct)

this will print:

After change
didSet

Just saying.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related