我有一个方法调用某个管理器的方法用一些键来保存int值。我的方法接收int和一些EnumKey枚举值作为键,挤出EnumKey的rawValue并将其作为字符串传递给管理器:
set(value: Int, forKey key: EnumKey) {
SomeManager.saveIntValueWithStringKey(valueToSave: value, keyToSave: key.rawValue)
}
enum EnumKey: String {
case One="first key"
case Two="second key"
}
我希望通过允许我的方法接收带有字符串原始值而不是EnumKey的每个枚举来使其更通用。在方法的实现中,我将关键参数的类型从EnumKey替换为GenericKey协议,并使EnumKey符合此协议:
set(value: Int, forKey key: GenericKey) {
SomeManager.saveIntValueWithStringKey(valueToSave: value, keyToSave: key.rawValue)
}
protocol GenericKey {
var rawValue: String { get }
}
enum EnumKey: String, GenericKey {
case One="first key"
case Two="second key"
}
但这String, GenericKey
看起来有点难看。我希望每个字符串可表示的枚举自动适应,而不提及它除了RawRepresentable和String原始类型之外还符合GenericKey协议。类似的东西:
protocol GenericKey: RawRepresentable {
associatedtype RawValue = String
}
但是编译器说“协议只能用作通用约束,因为它具有Self或相关的类型要求”。
什么是解释编译器的简单方法,该协议仅描述RawValue为String类型的RawRepresentable事物?
答案 0 :(得分:3)
您可以将该函数定义为通用,并将泛型类型定义为RawRepresentable
RawValue
类型String
,如下所示:
class Test {
func set<T: RawRepresentable>(value: Int, forKey key: T) where T.RawValue == String {
print("value \(value), key: \(key.rawValue)")
}
}
enum EnumKey: String {
case One="first key"
case Two="second key"
}
let t = Test()
t.set(value: 3, forKey: EnumKey.One) // prints "value 3, key: first key"