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> 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
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to