[swift-evolution] Problems with generics - should be fixed for Xcode 9?
Charlie Monroe
charlie at charliemonroe.net
Sun Sep 17 23:27:00 CDT 2017
This IMHO isn't a bug as the behavior is not completely defined. Joanna mentioned that Args is not generic, but it actually is, once you address it from global namespace - as it inherits the T type (while not used anywhere):
NSStringFromClass(Event<NSString>.Args.self)
NSStringFromClass(Event<NSDate>.Args.self)
-->
_TtGCC14__lldb_expr_375Event4ArgsCSo8NSString__
_TtGCC14__lldb_expr_375Event4ArgsCSo6NSDate__
Which is the root of the problem - you are currently not actually using the same class under different event types. It then makes a static property an issue as you are not able to distinguish these two scenarios with current language:
- is the stored property the same for all variations of the Args class?
- or does each type has its own stored property?
I can think of cases for both. And this is (from what I understood is the core of the problem).
@Joanna - in this particular case, I don't see the benefit of Args.empty over Args() as you currently create a new instance all the time. If the arguments are not intended to be generic, much better solution is to do something like:
class EventArgs {
public static let empty = Args()
}
class Event<T> {
typealias Args = EventArgs
}
> On Sep 17, 2017, at 11:59 PM, Félix Cloutier via swift-evolution <swift-evolution at swift.org> wrote:
>
> I always thought that this was a bug, but I can't find it on bugs.swift.org, so I'd love to know if it's meant to stay this way or not.
>
>> Le 16 sept. 2017 à 06:32, Joanna Carter via swift-evolution <swift-evolution at swift.org> a écrit :
>>
>> Greetings
>>
>> Old chestnut, sort of partially solved but still problems.
>>
>> Now we can nest types in generic types, what I want is :
>>
>> class Event<typeT>
>> {
>> class Args
>> {
>> public static let empty = Args() // error : Static stored properties not supported in generic types
>> }
>> }
>>
>> But the static let is not directly in the generic class.
>>
>> So, I end up doing another convoluted workaround in the shape of :
>>
>> class Event<typeT>
>> {
>> class Args
>> {
>> public static var empty: Args
>> {
>> return Args()
>> }
>> }
>> }
>>
>> The main difference is that I have to create a new instance on every call to Args.empty instead of returning the same one.
>>
>> Is this an oversight or as intended, with the hope of fixing it in a future version
>>
>> Joanna
>>
>> --
>> Joanna Carter
>> Carter Consulting
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170918/cd983190/attachment.html>
More information about the swift-evolution
mailing list