gpt4 book ai didi

xcode - 与 struct 中定义的 Void 回调相关的 Swift 编译器错误的解决方法/解决方案

转载 作者:行者123 更新时间:2023-11-30 10:15:05 25 4
gpt4 key购买 nike

由于typealias中缺乏通用支持在 Swift 中定义,我写了一个通用的 ResultHandler<T>像这样回调:

struct ResultHandler<T> {
let f: (result: T) -> ()
}

这对于使用 Void 以外的任何内容的处理程序非常有用:

Dispatch<Bool>.dispatch({ () -> (Result<Bool>) in
Result<Bool>(true)
}).onResult(ResultHandler() { (result: Bool) in
if result {
self.doSomething() // Method executes successfully
}
})

但是当尝试使用Void时:

Dispatch<Void>.dispatch({ () -> (Result<Void>) in
Result<Void>()
}).onResult(ResultHandler() { (result: Void) in // Compiler error here
self.doSomething()
})

出现编译错误:

Function signature '(Void) -> ()' is not compatible with expected type '(result: Void) -> ()'

这似乎具有误导性/编译器错误,就好像我更改签名以使用错误键入的值:

Dispatch<Void>.dispatch({ () -> (Result<Void>) in
Result<Void>()
}).onResult(ResultHandler() { (result: Void?) in // Compiler error here
self.doSomething()
})

错误消息选取了可选的指示 ? ,但仍然无法正确检测到我的result:标签:

Function signature '(Void?) -> ()' is not compatible with expected type '(result: Void) -> ()'

我做错了什么?

最佳答案

您不需要在闭包类型声明中指定参数名称 - 这就是给编译器带来问题的原因:

struct ResultHandler<T> {
let f: T -> ()
}

现在您可以创建使用 Bool 参数、Void 参数的 ResultHandler 实例,或者完全省略该参数:

let r1 = ResultHandler() { (result: Bool) in
if result {
// do something
}
}

let r2 = ResultHandler() { (_: Void) in
// do something
}

let r3 = ResultHandler() {
// do something
}

关于xcode - 与 struct 中定义的 Void 回调相关的 Swift 编译器错误的解决方法/解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30560794/

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