我试图更好地理解泛型,并且正在编写一个函数,它在给定字典中找到具有给定值的键。 如果未找到该值,则应返回nil。
func findKey<Key, Value: Equatable>(for value: Value, in dictionary: [Key: Value]) -> Key {
for set in dictionary {
if set.value == value {
return set.key
}
}
return nil //ERROR: Nil is incompatible with Type 'Key'
}
我发现了这个错误:
Nil与Type'Key'不兼容
答案 0 :(得分:2)
您的功能设置为按Key
-> Key
由于Key
是一个未包装的变量,因此无法返回nil。相反,您可以将函数设置为返回Optional
,这意味着它可以具有Key
,也可以为零。只需在返回类型
?
即可
func findKey<Key, Value: Equatable>(for value: Value, in dictionary: [Key: Value]) -> Key? {
for set in dictionary {
if set.value == value {
return set.key
}
}
return nil
}
答案 1 :(得分:2)
要返回nil,您需要返回一个Key Optional“Key?
”
您可以阅读有关选项here的更多信息。
func findKey<Key, Value: Equatable>(for value: Value, in dictionary: [Key: Value]) -> Key? {
for set in dictionary {
if set.value == value {
return set.key
}
}
return nil
}
答案 2 :(得分:1)
替代实施:
extension Dictionary where Value: Equatable {
func key(forValue v: Value) -> Key? {
return self.first(where: { $0.value == v})?.key
}
}
["a": 1, "b": 2, "c": 3].key(forValue: 3) // => Optional("c")
请注意,在两个Key
映射到同一Value
v
的情况下,将返回两个Key
中的哪一个不确定。要获得Key
Value
的所有v
映射,您可以执行以下操作:
extension Dictionary where Value: Equatable {
func keys(forValue v: Value) -> [Key] {
return self.filter{ $0.value == v}.map{ $0.key }
}
}
["a": 1, "b": 2, "c": 3, "d": 3].keys(forValue: 3) // => ["d", "c"]