On second thought, this doesn’t seem to solve the problem. Because once I 
extract the value out, they’re of different types. I can’t uniformly treat them 
as Named and process them.

Unless I got the enum definition wrong.

Sorry for the quick-fire mails.

> On 11 Jul 2017, at 9:15 PM, Glen Huang <hey...@gmail.com> wrote:
> 
> NM, I think you meant this?
> 
> enum Either<T1, T2> {  
>   case Left(T1)   
>   case Right(T2)
> }
> 
>> On 11 Jul 2017, at 9:06 PM, Glen Huang via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> 
>> This sounds pretty interesting.
>> 
>> But I can’t totally wrap my head around it. How do I "wrap types into enum 
>> cases”? Could you provide a sample code? Thanks.
>> 
>>> On 11 Jul 2017, at 8:50 PM, Adrian Zubarev <adrian.zuba...@devandartist.com 
>>> <mailto:adrian.zuba...@devandartist.com>> wrote:
>>> 
>>> If the solution you seek is not designed so that the module user can extend 
>>> the set of types then you could wrap your types into enum cases and use the 
>>> enum for your set. ;) When Swift will support anonymous enum cases, this 
>>> will be an elegant solution to these type of things.
>>> 
>>> -- 
>>> Adrian Zubarev
>>> Sent with Airmail
>>> Am 11. Juli 2017 um 14:46:12, Glen Huang via swift-users 
>>> (swift-users@swift.org <mailto:swift-users@swift.org>) schrieb:
>>> 
>>>> Thanks for bringing AnyHashable to my attention.
>>>> 
>>>> It works, but the types are now erased. I want to have a union of the two 
>>>> sets because I want to loop over it to treat each contained item as Named, 
>>>> so I can process them as though they are of the same type. Is this type of 
>>>> use case really should be addressed using super class?
>>>> 
>>>>> On 11 Jul 2017, at 7:38 PM, Howard Lovatt <howard.lov...@gmail.com 
>>>>> <mailto:howard.lov...@gmail.com>> wrote:
>>>>> 
>>>>> You can have a set of AnyHashable:
>>>>> 
>>>>>> var item = Set<AnyHashable>()
>>>>>> item.insert(AnyHashable(Foo()))
>>>>>> item.insert(AnyHashable(Bar()))
>>>>> 
>>>>> Depends what you will do with the set if this is viable or not. You can 
>>>>> also use classes and ObjectID.
>>>>> 
>>>>> You might want this though:
>>>>> 
>>>>>> var item = [AnyHashable: Any]
>>>>> extension Dictionary where Key == AnyHashable, Value: Hashable {
>>>>>     func insert(_ value: Value) {
>>>>>         self[AnyHashable(value)] == value
>>>>>     }
>>>>> }
>>>>>> item.insert(Foo())
>>>>>> item.insert(Bar())
>>>>> 
>>>>> So you get at the stored value.
>>>>> 
>>>>> -- Howard.
>>>>> 
>>>>> On 11 Jul 2017, at 8:09 pm, Glen Huang via swift-users 
>>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> I want to store some heterogeneous items all conform to a protocol 
>>>>>> inside a set, is it something possible to do in swift?
>>>>>> 
>>>>>> I tried this example:
>>>>>> 
>>>>>> ```
>>>>>> protocol Named: Hashable {
>>>>>>   var name: String { get }
>>>>>> }
>>>>>> 
>>>>>> extension Named {
>>>>>>   var hashValue: Int {
>>>>>>       return name.hashValue
>>>>>>   }
>>>>>> 
>>>>>>   static func ==(lhs: Self, rhs: Self) -> Bool {
>>>>>>       return lhs.name == rhs.name
>>>>>>   }
>>>>>> }
>>>>>> 
>>>>>> struct Foo: Named {
>>>>>>   var name = "foo"
>>>>>> }
>>>>>> 
>>>>>> struct Bar: Named {
>>>>>>   var name = "bar"
>>>>>> }
>>>>>> 
>>>>>> var item = Set<Named>()
>>>>>> item.insert(Foo())
>>>>>> item.insert(Bar())
>>>>>> ```
>>>>>> 
>>>>>> But it failed at `Set<Named>()` where it complained "Using 'Named' as a 
>>>>>> concrete type conforming to protocol 'Hashable' is not supported”.
>>>>>> 
>>>>>> After watching the WWDC session "Protocol-Oriented Programming in Swift” 
>>>>>> by Dave Abrahams, I try to use protocols whenever possible. But I can’t 
>>>>>> seem to overcome this barrier. Set.Element must confirm to Hashable, 
>>>>>> which inherits from Equatable, which has self requirement, which 
>>>>>> ultimately means that Set.Element all must be of the same type. So it 
>>>>>> seems it’s impossible to have heterogeneous items using protocol. Is 
>>>>>> that the case?
>>>>>> 
>>>>>> My use case is this:
>>>>>> 
>>>>>> I have an object that can contain two sets of other objects:
>>>>>> 
>>>>>> ```
>>>>>> class Parent {
>>>>>>   var foos: Set<Foo>
>>>>>>   var bars: Set<Bar>
>>>>>> }
>>>>>> ```
>>>>>> 
>>>>>> I want to define a computed property “all” that is the union of the two 
>>>>>> sets. Foo and Bar conform to the same protocol. I wonder what return 
>>>>>> type I should use for the union? Do I have to go back to OOP and define 
>>>>>> a super class for Foo and Bar?
>>>>>> 
>>>>>> Thanks.
>>>>>> _______________________________________________
>>>>>> swift-users mailing list
>>>>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>>>> 
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users
> 

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

Reply via email to