无法在泛型函数中返回nil

时间:2017-07-06 16:41:37

标签: swift generics optional

我试图更好地理解泛型,并且正在编写一个函数,它在给定字典中找到具有给定值的键。 如果未找到该值,则应返回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'不兼容

3 个答案:

答案 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"]