There is a 4th way.

Introduce an internal protocol Associatable, which would tell the compiler to 
add an additional (hidden) field to the object which would include the 
"dictionary" of key -> value associated values. (It would be off-limits to 
extensions, of course).

This way:

- it won't be a single dictionary containing all the associated values
- classes can opt-in to this
- the dictionary will be per-instance

This is a midway between the current implementation of ObjC associated objects 
and of what someone has suggested to have an extra space for each object for 
the AO...


> On Oct 9, 2016, at 9:47 PM, Jay Abbott via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I have been thinking further on this and in addition to my previous two 
> thoughts about implementation, I have had another idea...
> 
> 3. If there is a bit spare in the object header somewhere (that is currently 
> always zero), this could be used to signify the presence of an additional 
> struct that immediately follows after the existing object data. I *think* 
> that this method would allow binary compatibility with older modules. 
> Instances that have this bit set would allow stored properties in extensions. 
> The struct at the end would have one member, a pointer to a table of 
> additional objects/values, stored properties defined in extensions could be 
> stored in here, using a hash derived from the 
> module/protocol/extension/property name (or something better if it exists).
> 
> The struct could be very simple as described above or more complex, with 
> additional features, for example a list of deinit hooks, dynamically added 
> methods, etc. The struct itself may also be dynamic in size/layout if such 
> complexity is warranted by size or extensibility concerns. Perhaps it should 
> start with some flags and its size (size would be fixed and only increase 
> with revisions so this would double as a 'version' number).
> 
> If viable - this would be a much better way to implement this feature than my 
> previous two ideas. It doesn't require global lookups or additional levels of 
> indirection beyond accessing the dynamic data/feature itself.
> 
> 
> On Mon, 3 Oct 2016 at 04:13 Jay Abbott <j...@abbott.me.uk 
> <mailto:j...@abbott.me.uk>> wrote:
> Are stored properties in extensions already being discussed elsewhere? Is 
> this one of those deferred-but-not-indexed-anywhere subjects?
> 
> I wonder how stored properties could potentially be implemented, I can only 
> think of two ways:
> 
> 1. An extra pointer per instance (with resulting ABI compatability 
> implications) to hold a collection of the stored items.
> 
> 2. A global lookup for any instance where stored properties have been set.
> 
> I'm not a language implementation expert, or familiar with the swift 
> implementation, so there may be other/better ways - I'd like to know if there 
> are?
> 
> If not, and option 2 was employed, a little foresight might enable the 
> mechanism to be overloaded in the future for other dynamic features too. A 
> bit flag (I'm hoping there's a spare bit in an existing flags field 
> somewhere?) could indicate whether any feature had caused the object to be 
> added to this lookup and deinit could check this bit and make sure the object 
> is removed, thus any stored properties are nilled. The lookup value could be 
> a struct with one member (extensionStoredProperties), and additional members 
> can be added in future for new features.
> 
> I get the impression from the associated objects discussion that perhaps 
> there are much better, more optimal, more ingenious, more unknown-by-me ways 
> of doing such things, so apologies if this whole idea is way-off the mark :D
> 
> Jay
> 
> P.S. Note that stored properties in extensions could enable developers to 
> implement their own dynamic features in Swift.. so such desires could be 
> satisfied in the short term until they could be done properly in the language.
> 
> On Sat, 1 Oct 2016 at 00:49 Chris Lattner via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> On Sep 30, 2016, at 2:51 PM, Ted F.A. van Gaalen via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> > Is it possible to have best of (these completely different) both worlds?
> 
> Yes, of course it is.  Your email spends a lot of words trying to form a 
> false dichotomy.  Swift can definitely have both awesome dynamic features 
> while still having performance, predictability and safety.
> 
> > Would it be possible in Swift to have facilities to generate objects
> > dynamically at runtime? and, if desirable, how can such be implemented?
> 
> Here’s an extant implementation that you can use today:
> https://github.com/Zewo/Reflection <https://github.com/Zewo/Reflection>
> 
> I’m sure it isn’t ideal, but it proves that it can be done.  When we have 
> bandwidth to reevaluate this area from first principles, I’m sure we can make 
> improvements on it.
> 
> I will grant you that Smalltalk is a beautiful language in its simplicity, 
> but for that simplicity it makes many tradeoffs that we’re not willing to 
> make.  We are willing to make the internal implementation of Swift complex if 
> that means that we get a beautiful model for programmers - one that preserves 
> the virtues of safety-by-default, predictability, performance, and 
> joy-to-develop-in.
> 
> The meme of “Swift can never (or will never) support dynamic features” is 
> tired, and also wildly inaccurate.
> 
> -Chris
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to