以协议types为关键字的Swift Dictionary

这里简短的问题:

我得到一个协议protocol SCResourceModel {..}和一个字典,它应该使用这个协议types作为关键字: [SCResourceModel : String] 。 这显然不起作用,因为字典中的关键字必须符合协议Hashable 。 使我的SCResourceModelSCResourceModelinheritance或尝试像这样[protocol<SCResourceModel, Hashable> : String]显然不能正常工作,因为HashableEquatable只能用作通用约束,而不是作为types本身。

我观看了WWDC 2015,并且在Swift 2.0中,可以将约束添加到如下协议: protocol SCResourceModel where Self: Hashable {..}直接解决了这个问题(非常好)。

无论如何,我的问题是:我可以做一些类似的当前Swift 1.2版本,并以某种方式使用此协议作为字典的关键? 或者任何人都可以提出一个很好的解决方法或其他我可能忽略的东西?

我目前看到的Swift 1.2的唯一解决scheme是将协议转换为inheritance自NSObject的类,并且必须在我的API中进一步使用。

谢谢你的帮助!

我可能会想方向:

 protocol SCResourceModel { var hashValue: Int { get } func isEqualTo(another: SCResourceModel) -> Bool // ... } struct SCResourceModelWrapper: Equatable, Hashable { let model: SCResourceModel var hashValue: Int { return model.hashValue ^ "\(model.dynamicType)".hashValue } } func == (lhs: SCResourceModelWrapper, rhs: SCResourceModelWrapper) -> Bool { return lhs.model.isEqualTo(rhs.model) } struct SCResourceModelDictionary<T> { private var storage = [SCResourceModelWrapper: T]() subscript(key: SCResourceModel) -> T? { get { return storage[SCResourceModelWrapper(model: key)] } set { storage[SCResourceModelWrapper(model: key)] = newValue } } } 

好吧,据我所知,把协议本身作为一个关键是没有什么好方法的。 但我很确定协议名称的string版本可以很好地满足您的需求。 作为奖励,你也可以把协议对象作为字典中的值(如果这在你的情况下是有用的)

事情是,我无法在Swift中find一个很好的方法,但是这就是我在Objective-C中提出的,也许你会比我更好地find在Swift中做到这一点的方法:

 // With a protocol declared... @protocol TestProtocol <NSObject> @end @implementation // Inside the implementation you can use NSStringFromProtocol() Protocol *proto = @protocol(TestProtocol); NSLog(@"Protocol: %@", NSStringFromProtocol(proto)); @end 

输出:

 Protocol: TestProtocol 

该代码中的@protocol部分是我不确定如何在Swift中完成的部分,如果情况更糟糕,可以随时连接到Objective-C文件。 希望这给你一些想法!