Such a feature would require limitations, yes. For a strawman, what would be 
the resulting system behavior if someone had a use case to add a string unit 
identifier to all numeric values?

At a minimum:
- every number in the system now would take more space
- you would be unable to redefine the comparison operator (all else being the 
same) to account for this new unit identifier
- if redefinition was possible, comparisons for this type are now more complex 
and more computationally expensive.

A more typical example - adding a flag to all Strings to indicate whether or 
not they have been pre-sanitized for use in XML/JSON/SQL/etc (such as in Ruby 
on Rails)

-DW

> On Apr 4, 2016, at 3:49 PM, Haravikk via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> There was a proposal for this a little while ago, what you’re looking for are 
> mixins, though I’m not sure they would solve your problem either.
> 
> The reason this can’t be done as part of an extension is that there are only 
> really two ways to implement it:
> 
> Expand the Type: Basically the new data has to be added to the type somehow. 
> For example, a struct of four Ints is about 32 bytes, to add a stored 
> property you’d need to increase that. This could be fine if it’s internal to 
> a module, as it can be computed in advance, but if you’re extending an 
> imported type (as in your case) then this isn’t ideal as your version of 
> UITextFields would be a different from the size expected by other libraries 
> that don’t know about your extension, which would mean that some kind of 
> transformation is required between your version of UITextFields and any other 
> variation of it that you need to work with; not impossible, but not the 
> nicest thing to have to do and potentially not great for performance.
> 
> Lookup Added Properties: I believe this is exactly what you’re doing with 
> your workaround; namely your added properties are being stored separately and 
> associated to an instance so that they can be looked up/changed without 
> touching the size of the original. However, this kind of lookup isn’t great 
> for performance either.
> 
> So both options would have to trade performance for stored property style 
> syntax, which IMO would not be a great thing to do as it would hide what’s 
> going on behind the scenes to make it work. Maybe if we had some kind of 
> Swiftier methods for doing either option explicitly that might be okay, since 
> it could give simpler means that explicitly expose the performance impact, 
> but APIs designed to handle type-erased wrappers shouldn’t need anything like 
> this. Of course that’s no comfort when dealing with APIs that do, especially 
> legacy ones, but you’ve found a workaround that seems to do what you need, 
> and there may be other options (can’t think of any just now).
> 
> Anyway, that’s the gist of the problem as I understand it, hope some of that 
> helps to fill in why it’s not a straightforward thing to address.
> 
>> On 4 Apr 2016, at 11:00, Yogev Sitton via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> Hi,
>> 
>> I try to avoid using inheritance for just adding functionality - for that I 
>> use (and love) extensions.
>> This works great for functions - but I find the lack for stored properties 
>> support limiting.
>> 
>> Here’s my use case:
>> I want to map every textfield in my view controller to a JSON field - so it 
>> would be very helpful to add a string Key property to all of the 
>> UITextFields in my app.
>> For now this is how I solve this issue (inside the extension):
>> 
>> struct customProperties {
>>      static var key : String?
>> }
>> 
>> var key : String? {
>>      get {
>>              return objc_getAssociatedObject(self, &customProperties.key) 
>> as? String
>>      }
>>      set (value){
>>              
>> objc_setAssociatedObject(self,&customProperties.key,value,.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
>>      }
>> }
>> 
>> I would love to just add an actual variable to the extension without the 
>> need to use Obj-C associated objects.
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto: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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

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

Reply via email to