Oops! that is buggy. I should check syntax before posting… Here is the corrected version:
public struct AnyKey : Hashable { public let hashValue: Int public let key: Any public let equals: (Any, AnyKey) -> Bool init<T: Hashable>(_ key: T) { self.hashValue = key.hashValue self.key = key self.equals = { $0 as! T == $1.key } } } public func == (lhs: AnyKey, rhs: AnyKey) -> Bool { return lhs.equals(lhs,rhs) } > On Mar 25, 2016, at 5:59 PM, Hooman Mehr via swift-users > <swift-users@swift.org> wrote: > > You can also get a heterogenous dictionary, but it needs a type erasing > helper box. With the following declarations: > > public func ==<T: Equatable>(lhs: T, rhs: Any) -> Bool { > > if let rhs = rhs as? T { return lhs == rhs } else { return false } > } > > public struct AnyKey : Hashable { > > public let hashValue: Int > public let key: Any > public let equals: (AnyKey) -> Bool > > init<T: Hashable>(_ key: T) { > > self.hashValue = key.hashValue > self.key = key > self.equals = { self.key as! T == $0.key } > } > } > > public func == (lhs: AnyKey, rhs: AnyKey) -> Bool { lhs.equals(rhs) } > > You can now create a heterogenous [AnyKey: Any] dictionary. Note that > `AnyKey` is not very memory efficient. > >> On Mar 25, 2016, at 5:27 PM, Hooman Mehr <hoo...@mac.com >> <mailto:hoo...@mac.com>> wrote: >> >> >>> On Mar 25, 2016, at 2:51 PM, Jason Sadler via swift-users >>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote: >>> >>> (My particular use case can be seen here: >>> https://gist.github.com/sadlerjw/2cc16b4375b02fe7f400 >>> <https://gist.github.com/sadlerjw/2cc16b4375b02fe7f400> … and the best >>> information I’ve been able to find on this so far is here: >>> http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself/33524927#33524927 >>> >>> <http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself/33524927#33524927>) >> >> Here is the best you can do for your particular use case: >> >> protocol AnyEquatable { func equals(other: Any) -> Bool } >> >> func ==<T: Equatable>(lhs: T, rhs: Any) -> Bool { >> >> if let rhs = rhs as? T { return lhs == rhs } else { return false } >> } >> >> extension Bool: AnyEquatable { func equals(other: Any) -> Bool { return >> self == other } } >> >> extension Int: AnyEquatable { func equals(other: Any) -> Bool { return >> self == other } } >> >> extension Double: AnyEquatable { func equals(other: Any) -> Bool { return >> self == other } } >> >> extension String: AnyEquatable { func equals(other: Any) -> Bool { return >> self == other } } >> >> extension Array { >> >> func indexOfAny(element : AnyEquatable) -> Index? { return indexOf { >> element.equals($0) } } >> } >> >> var array: [Any] = [false, 1, 2.0, "three"] >> >> array.indexOfAny(2.0) >> > > _______________________________________________ > swift-users mailing list > 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