enum BinaryTree<T> { indirect case Node(T,BinaryTree<T>,BinaryTree<T>) case nothing}func inorder<T>(_ root: BinaryTree<T>) -> [T] { switch root { case .nothing: return [] case let .Node(val,left,right): return inorder(left) + [val] + inorder(right) }}
这是我得到的错误:
$swift ADT.swift ADT.swift:83:20: error: cannot convert value of type 'BinaryTree<T>' to expected argument type 'BinaryTree<_>' return inorder(left) + [val] + inorder(right) ^~~~
但是,这有效:
func inorder<T>(_ root: BinaryTree<T>) -> [T] { switch root { case .nothing: return [] case let .Node(val,right): let l = inorder(left) let r = inorder(right) return l + [val] + r }}
我的语法有错吗?谢谢!
我正在使用Swift 3.0.
解决方法 更新所以我试着将问题压缩成最小的示例代码,无法编译,asked a question我自己并提交了 SR-4304.结果答案是,这确实是编译器中的一个错误.
原始答案
据我所知,你的语法是完全有效的.似乎Swift编译器的类型推断似乎需要在第二个解决方案显然提供的正确方向上轻推.由于我在过去经历过几个类似的问题,特别是关于运算符,你的问题激发了我尝试其他几种方法来加入数组.这些都有效(我只是展示了最后三种情况的返回语句和支持函数):
return (inorder(left) as [T]) + [val] + inorder(right)return Array([inorder(left),[val],inorder(right)].joined())return [inorder(left),inorder(right)].reduce([],+)return [inorder(left),inorder(right)].flatMap {return (+)(inorder(left),[val]) + inorder(right)}func myjoin1<T>(_ arrays: [T]...) -> [T]{ return arrays.reduce([],+)}return myjoin1(inorder(left),inorder(right))func myjoin2<T>(_ array1: [T],_ array2: [T],_ array3: [T]) -> [T]{ return array1 + array2 + array3}return myjoin2(inorder(left),inorder(right))extension Array{ func appending(_ array: [Element]) -> [Element] { return self + array }}return inorder(left).appending([val]).appending(inorder(right))
将 *** 作符作为函数调用也会编译:
如果对Swift编译器有更深入了解的人可以对此有所了解,那就太好了.
总结以上是内存溢出为你收集整理的Swift中使用泛型的递归枚举全部内容,希望文章能够帮你解决Swift中使用泛型的递归枚举所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)