Swift报错:void函数中返回非void值,求原因及解决方法
报错原因与修复方案
报错原因
你碰到的 error: unexpected non-void return value in void function 错误,根源在于forEach的闭包特性:
forEach要求传入的闭包是**无返回值(Void)**的,但你在闭包里写了return [index, dic[value]!],试图返回一个数组,这和闭包的类型要求不匹配,所以编译器报错。- 退一步说,就算闭包允许返回值,这样的return也没法把结果传递到外层的
findIndexes函数,根本达不到返回目标索引的目的。
修复方案(用for-in循环替代forEach)
改用for-in循环就能直接在外层函数返回结果,逻辑也更清晰,修正后的代码如下:
func findIndexes(_ nums: [Int], _ target: Int) -> [Int] { var dic = [Int:Int]() for (index, value) in nums.enumerated() { // 检查当前值是否在字典中,存在则直接返回对应的索引对 if let matchedIndex = dic[value] { return [matchedIndex, index] } // 将差值作为key,当前索引作为value存入字典 let difference = target - value dic[difference] = index } // 未找到符合条件的数对,返回空数组 return [] } print(findIndexes([0,11,15,2,7], 9)) // 输出 [0,4]
代码优化说明
- 替换
forEach为for-in循环,找到匹配数对时直接通过外层函数的return返回结果,解决了闭包返回值的问题。 - 简化字典查找逻辑:直接用
dic[value]判断是否存在匹配项,比dic.keys.contains(value)效率更高(字典的key查找是O(1)时间复杂度)。 - 移除了多余的
!dic.values.contains(index)判断,因为数组索引本身唯一,不会重复存入字典,这个判断没有实际作用。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

