Swift泛型函数报错:无法将返回表达式转换为返回类型
解决Swift泛型函数调用时的类型推断问题
你碰到的核心问题是Swift编译器没办法自动推断出setThingRevision泛型函数的具体类型参数——虽然RealType确实遵循了Revisionable协议,但在setMyRealStuffRevision的返回上下文里,元组数组的类型信息不够明确,导致编译器无法把模糊的[(_, Int)]和你指定的[(RealType, Int)]对应起来。
两种正确的写法
1. 显式指定泛型类型(最稳妥的方式)
直接在调用泛型函数时,通过<RealType>明确告诉编译器泛型参数的具体类型:
func setMyRealStuffRevision(entity name: String) -> [(RealType,Int)] { return setThingRevision<RealType>(entity: name) }
这样编译器就能精准匹配类型,返回的数组类型会直接和函数的返回类型对齐,报错自然就消失了。
2. 利用类型推断(需上下文足够清晰)
如果你的代码结构允许,也可以通过变量接收结果再返回,让编译器通过变量类型推断泛型参数:
func setMyRealStuffRevision(entity name: String) -> [(RealType,Int)] { let result: [(RealType, Int)] = setThingRevision(entity: name) return result }
不过这种方式和显式指定的效果一致,显式写法反而更直观,可读性更强。
针对你补充代码的额外提醒
你补充的代码里用了as! [GenericType]强制转换数组类型,这种写法存在崩溃风险——如果getArrayFromEntity返回的数组无法转换为[GenericType],程序会直接崩溃。建议换成安全的可选绑定写法:
func setThingRevision<GenericType:Revisionable>(entity name: String) -> [(GenericType,Int)] { var resultArray = [(GenericType,Int)]() guard let items = getArrayFromEntity(name) as? [GenericType] else { return resultArray } for item in items { resultArray.append((item, 99)) // 这里注意:你循环里直接return了,只会处理第一个元素就返回,是不是笔误? // return resultArray } return resultArray }
另外你在循环里直接return resultArray,会导致只处理第一个元素就返回结果,如果这不是你的预期,记得把这行移到循环外面。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

