TRet) -> V-6ren">
gpt4 book ai didi

swift - "ambiguous use"迁移到 swift 4 后的通用方法

转载 作者:IT王子 更新时间:2023-10-29 05:37:54 24 4
gpt4 key购买 nike

我正在尝试将我的代码从 xcode 8.2 swift 3.0.2 迁移到 xcode 9 swift 4,但我对这段代码有疑问:

func test<T0, TRet>(_ fn: (T0) -> TRet) -> Void {
print("foo1")
print(T0.self)
}

func test<T0, T1, TRet>(_ fn: (T0, T1) -> TRet) -> Void {
print("foo2")
print(T0.self)
print(T1.self)
}

let fn2 : (Int, Int) -> Int = { (x:Int, y:Int)->Int in
return x+y
}

test(fn2)

xcode 8.0.2,swift 3.0.2 结果:

foo2
Int
Int

xcode 9,swift 4 结果:

Playground execution failed:

error: MyPlayground.playground:12:1: error: ambiguous use of 'test'
test(fn2)
^

MyPlayground.playground:1:6: note: found this candidate
func test<T0, T1, TRet>(_ fn: (T0, T1) -> TRet) -> Void {
^

我错过了什么吗? swift 4 中是否有任何新功能导致此错误?


更新

我按照评论中的建议在 bugs.swift.org 上提交了一个错误。
https://bugs.swift.org/browse/SR-6108

最佳答案

我遇到了同样的问题,并偶然发现了一个解决方法(就我而言)比通过命名消除歧义更好。也许它甚至不是解决方法,只是事情必须如此。这也可能是 Swift 4.1 中的新功能(不确定,因为我直接从 Swift 3 迁移到 4.1)

改变这个:

func test<T0, TRet>( fn: (T0) -> TRet) -> Void

...为此...

func test<T0, TRet>( fn: ((T0)) -> TRet) -> Void

(注意 T0 回调参数周围的一对额外的括号,它明确地使其成为 1 元组)

此更改后,test(fn2 ) 编译并调用 test<T0,T1,TRet>重载。编译器似乎能够将具有 N 个参数的函数视为具有一个 N-way-tuple 参数的函数。因此,(T0) -> TRet(T0,T1) -> TRet重载是 fn2 的候选者,调用不明确。添加第二对括号 ((T0)) -> TRet将重载限制为具有单个参数或单向元组的参数。

关于swift - "ambiguous use"迁移到 swift 4 后的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46649106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com