我试图做某事可能很奇怪,但我会堆积以下问题。
我有一个带有闭包属性的结构,我设置了异步函数。
我想要的是,调用此异步函数来获取返回值。
我可以通过解决方案解决这个问题,但我想以正确的方式做到这一点。
感谢任何帮助。
这是我的代码:
struct Item {
var myselector: (String -> Void)?
func getMeThat(completion: String -> Void) {
completion(myselector()) // error: cannot call value of non-function type String -> Void
}
}
class API {
class func requestThing(completion: String -> Void) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
completion("Kenan")
})
}
}
class ViewController {
func viewDidLoad() {
var item = Item()
item.myselector = { // error: cannot assign value of type () -> () to type String -> Void
API.requestThing({ (str: String) in
<#code#>
})
}
item.getMeThat({ (rtn: String) in
print(rtn)
})
}
}
答案 0 :(得分:2)
主要问题是由于奇怪的重复而导致您与签名失配。
您正在将闭包设置为结构的变量,但也为该函数提供了完成。做其中一个。
struct Item {
func getMeThat(completion: String -> Void) {
API.requestThing(completion)
}
}
class API {
class func requestThing(completion: String -> Void) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
completion("Kenan")
})
}
}
class ViewController {
func viewDidLoad() {
let item = Item()
item.getMeThat({ (rtn: String) in
print(rtn)
})
}
}
如果你只是想延迟代码的执行,你就是这样做的
struct Item {
var myselector: (Void -> Void)?
func executeSelector() {
guard let sel = myselector else {
return
}
sel()
}
}
class API {
class func requestThing(completion: String -> Void) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
completion("Kenan")
})
}
}
class ViewController {
func viewDidLoad() {
var item = Item()
item.myselector = {
API.requestThing({ (str: String) in
print(str)
})
}
item.executeSelector()
}
}