> On Nov 4, 2016, at 9:45 AM, Ryan Lovelett <r...@lovelett.me> wrote: > > Just out of curiosity if I looked at the SIL, would that allow me to see > any of that in action? Or would it be too opaque?
Maybe. What might be more directly useful is looking at the source for `Data` in Foundation: <https://github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/Data.swift#L73> You'll notice that `Data` has an internal property called `_wrapped` of type `_SwiftNSData`, which (if you jump up a few dozen lines) is a class. Since it's inside a class, the contents of that property won't be automatically copied. Looking around a little more thoroughly, you might notice that `mutating` methods call `_applyUnmanagedMutation(_:)`: <https://github.com/apple/swift/blob/14b689dee1dcd4e5e7a8b5722ce343a57e10149d/stdlib/public/SDK/Foundation/Data.swift#L444>. If you search the codebase, you'll find the implementation of that method in a different file: <https://github.com/apple/swift/blob/c3b7709a7c4789f1ad7249d357f69509fb8be731/stdlib/public/SDK/Foundation/Boxing.swift#L173>. The heart of the copy-on-write behavior is the call to `isKnownUniquelyReferenced(_:)`. This is a part of the standard library which is basically only used to implement copy-on-write. `isKnownUniquelyReferenced(_:)` returns `true` if your variable is the only one which has a strong reference to the object. If so, it's safe to mutate; if not, you'll need to make a copy so you don't affect any of the other instances sharing the object with you. -- Brent Royal-Gordon Architechies _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users