Custom swift class properties passed by reference?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I have a custom class that I've written an equal/not equal function test for. I'm trying to test if an object I've modified is equal to the original object, but whenever I modify the second object, the original object seems to be modified as well. Here's some sample code (you can run this in a Playground):



// Custom class
class MyClass {
var foo: Bool = false

static func ==(a: MyClass, b: MyClass) -> Bool {
return (a.foo == b.foo)
}
static func !=(a: MyClass, b: MyClass) -> Bool {
return !(a==b)
}

required init() {
// do nothing
}
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = MyClass()

tempObj = originalObj

tempObj.foo = true

print(originalObj.foo) // Output: "true" (?!?!)
print(tempObj == originalObj) // Output: "true" (?!?!)


Why does changing the value of tempObj change the value of originalObj, and how can I prevent this behavior?










share|improve this question























  • tempObj = originalObj makes both reference variables point to the same object in memory. Don't do that if you don't want both to be the same.

    – rmaddy
    Jan 3 at 3:21











  • class are reference types. You can use value types like structs and enums. in which case, when you will write, tempObj = originalObj, it will actually copy the object and hence any future changes to originalObj will not modify tempObj.

    – Deepika
    Jan 3 at 3:26


















0















I have a custom class that I've written an equal/not equal function test for. I'm trying to test if an object I've modified is equal to the original object, but whenever I modify the second object, the original object seems to be modified as well. Here's some sample code (you can run this in a Playground):



// Custom class
class MyClass {
var foo: Bool = false

static func ==(a: MyClass, b: MyClass) -> Bool {
return (a.foo == b.foo)
}
static func !=(a: MyClass, b: MyClass) -> Bool {
return !(a==b)
}

required init() {
// do nothing
}
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = MyClass()

tempObj = originalObj

tempObj.foo = true

print(originalObj.foo) // Output: "true" (?!?!)
print(tempObj == originalObj) // Output: "true" (?!?!)


Why does changing the value of tempObj change the value of originalObj, and how can I prevent this behavior?










share|improve this question























  • tempObj = originalObj makes both reference variables point to the same object in memory. Don't do that if you don't want both to be the same.

    – rmaddy
    Jan 3 at 3:21











  • class are reference types. You can use value types like structs and enums. in which case, when you will write, tempObj = originalObj, it will actually copy the object and hence any future changes to originalObj will not modify tempObj.

    – Deepika
    Jan 3 at 3:26














0












0








0








I have a custom class that I've written an equal/not equal function test for. I'm trying to test if an object I've modified is equal to the original object, but whenever I modify the second object, the original object seems to be modified as well. Here's some sample code (you can run this in a Playground):



// Custom class
class MyClass {
var foo: Bool = false

static func ==(a: MyClass, b: MyClass) -> Bool {
return (a.foo == b.foo)
}
static func !=(a: MyClass, b: MyClass) -> Bool {
return !(a==b)
}

required init() {
// do nothing
}
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = MyClass()

tempObj = originalObj

tempObj.foo = true

print(originalObj.foo) // Output: "true" (?!?!)
print(tempObj == originalObj) // Output: "true" (?!?!)


Why does changing the value of tempObj change the value of originalObj, and how can I prevent this behavior?










share|improve this question














I have a custom class that I've written an equal/not equal function test for. I'm trying to test if an object I've modified is equal to the original object, but whenever I modify the second object, the original object seems to be modified as well. Here's some sample code (you can run this in a Playground):



// Custom class
class MyClass {
var foo: Bool = false

static func ==(a: MyClass, b: MyClass) -> Bool {
return (a.foo == b.foo)
}
static func !=(a: MyClass, b: MyClass) -> Bool {
return !(a==b)
}

required init() {
// do nothing
}
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = MyClass()

tempObj = originalObj

tempObj.foo = true

print(originalObj.foo) // Output: "true" (?!?!)
print(tempObj == originalObj) // Output: "true" (?!?!)


Why does changing the value of tempObj change the value of originalObj, and how can I prevent this behavior?







swift class properties pass-by-reference






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 3 at 3:11









MattMatt

71741943




71741943













  • tempObj = originalObj makes both reference variables point to the same object in memory. Don't do that if you don't want both to be the same.

    – rmaddy
    Jan 3 at 3:21











  • class are reference types. You can use value types like structs and enums. in which case, when you will write, tempObj = originalObj, it will actually copy the object and hence any future changes to originalObj will not modify tempObj.

    – Deepika
    Jan 3 at 3:26



















  • tempObj = originalObj makes both reference variables point to the same object in memory. Don't do that if you don't want both to be the same.

    – rmaddy
    Jan 3 at 3:21











  • class are reference types. You can use value types like structs and enums. in which case, when you will write, tempObj = originalObj, it will actually copy the object and hence any future changes to originalObj will not modify tempObj.

    – Deepika
    Jan 3 at 3:26

















tempObj = originalObj makes both reference variables point to the same object in memory. Don't do that if you don't want both to be the same.

– rmaddy
Jan 3 at 3:21





tempObj = originalObj makes both reference variables point to the same object in memory. Don't do that if you don't want both to be the same.

– rmaddy
Jan 3 at 3:21













class are reference types. You can use value types like structs and enums. in which case, when you will write, tempObj = originalObj, it will actually copy the object and hence any future changes to originalObj will not modify tempObj.

– Deepika
Jan 3 at 3:26





class are reference types. You can use value types like structs and enums. in which case, when you will write, tempObj = originalObj, it will actually copy the object and hence any future changes to originalObj will not modify tempObj.

– Deepika
Jan 3 at 3:26












1 Answer
1






active

oldest

votes


















2














Classes in swift are Reference Types whereas Structs are Value Types. There are two ways to achieve what you want. You can either use struct instead of class or write a copy method for this class and use that method. Something like this



class MyClass {
var foo: Bool = false

static func ==(a: MyClass, b: MyClass) -> Bool {
return (a.foo == b.foo)
}
static func !=(a: MyClass, b: MyClass) -> Bool {
return !(a==b)
}
required init() {
// do nothing
}
func copy() -> MyClass {
let temp = MyClass()
temp.foo = foo
return temp
}
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = originalObj.copy()





share|improve this answer


























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54015842%2fcustom-swift-class-properties-passed-by-reference%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2














    Classes in swift are Reference Types whereas Structs are Value Types. There are two ways to achieve what you want. You can either use struct instead of class or write a copy method for this class and use that method. Something like this



    class MyClass {
    var foo: Bool = false

    static func ==(a: MyClass, b: MyClass) -> Bool {
    return (a.foo == b.foo)
    }
    static func !=(a: MyClass, b: MyClass) -> Bool {
    return !(a==b)
    }
    required init() {
    // do nothing
    }
    func copy() -> MyClass {
    let temp = MyClass()
    temp.foo = foo
    return temp
    }
    }

    let originalObj: MyClass = MyClass()
    var tempObj: MyClass = originalObj.copy()





    share|improve this answer






























      2














      Classes in swift are Reference Types whereas Structs are Value Types. There are two ways to achieve what you want. You can either use struct instead of class or write a copy method for this class and use that method. Something like this



      class MyClass {
      var foo: Bool = false

      static func ==(a: MyClass, b: MyClass) -> Bool {
      return (a.foo == b.foo)
      }
      static func !=(a: MyClass, b: MyClass) -> Bool {
      return !(a==b)
      }
      required init() {
      // do nothing
      }
      func copy() -> MyClass {
      let temp = MyClass()
      temp.foo = foo
      return temp
      }
      }

      let originalObj: MyClass = MyClass()
      var tempObj: MyClass = originalObj.copy()





      share|improve this answer




























        2












        2








        2







        Classes in swift are Reference Types whereas Structs are Value Types. There are two ways to achieve what you want. You can either use struct instead of class or write a copy method for this class and use that method. Something like this



        class MyClass {
        var foo: Bool = false

        static func ==(a: MyClass, b: MyClass) -> Bool {
        return (a.foo == b.foo)
        }
        static func !=(a: MyClass, b: MyClass) -> Bool {
        return !(a==b)
        }
        required init() {
        // do nothing
        }
        func copy() -> MyClass {
        let temp = MyClass()
        temp.foo = foo
        return temp
        }
        }

        let originalObj: MyClass = MyClass()
        var tempObj: MyClass = originalObj.copy()





        share|improve this answer















        Classes in swift are Reference Types whereas Structs are Value Types. There are two ways to achieve what you want. You can either use struct instead of class or write a copy method for this class and use that method. Something like this



        class MyClass {
        var foo: Bool = false

        static func ==(a: MyClass, b: MyClass) -> Bool {
        return (a.foo == b.foo)
        }
        static func !=(a: MyClass, b: MyClass) -> Bool {
        return !(a==b)
        }
        required init() {
        // do nothing
        }
        func copy() -> MyClass {
        let temp = MyClass()
        temp.foo = foo
        return temp
        }
        }

        let originalObj: MyClass = MyClass()
        var tempObj: MyClass = originalObj.copy()






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Jan 3 at 4:13

























        answered Jan 3 at 3:28









        MalikMalik

        2,36811026




        2,36811026
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54015842%2fcustom-swift-class-properties-passed-by-reference%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith