Swift 与代表迅速结束对话
因此,当我从委托方法接收到某些内容时,我尝试创建一个闭包:Swift 与代表迅速结束对话,swift,delegates,closures,Swift,Delegates,Closures,因此,当我从委托方法接收到某些内容时,我尝试创建一个闭包: typealias CompletionResponse = ((_ response: AnyObject) -> Void)? class SomeClass { static let shared = SomeClass() var completion: CompletionResponse? func getSomthing(completion: CompletionResponse)
typealias CompletionResponse = ((_ response: AnyObject) -> Void)?
class SomeClass {
static let shared = SomeClass()
var completion: CompletionResponse?
func getSomthing(completion: CompletionResponse) {
self.completion = completion
}
func someDelegateMethode(info: [String]) {
// Error is here
if let completion = self.completion {
completion(info)
}
}
}
_ = SomeClass.shared
SomeClass.shared
SomeClass.shared.getSomthing { (obj) in
print(obj as! [String])
}
SomeClass.shared.someDelegateMethod(info: ["Hello", "There"])
我不知道怎么做。。
谢谢你的帮助
收到错误:无法调用非函数类型“CompletionResponse”(又名“Optional()>”的值)
谢谢从typealias中删除可选选项。编译器不知道如何调用
completion
,因为它有一个双可选类型
此外,如果让,您可以使用可选链接而不是
self.completion?(信息)
从typealias中删除可选项。编译器不知道如何调用completion
,因为它有一个双可选类型
此外,如果让
,您可以使用可选链接而不是
self.completion?(info)
您的typealias CompletionResponse
是可选的
,您的完成属性也是可选的
。当您打印完成类型时
,您可以看到它是一个双可选类型
:
print(type(of: self.completion)) //Optional<Optional<(AnyObject) -> ()>>
print(类型(of:self.completion))//可选<Optional<(AnyObject)->()>>
您要做的是调用completion
函数。但是,由于它被包装在一个可选
中,因此您告诉编译器在枚举可选
中调用一个函数。枚举不是函数类型,无法调用,这就是错误试图告诉您的
现在,有多种方法可以解决您的问题
对我来说最有意义的解决方案是从typealias CompletionResponse
中删除Optional
类型
typealias CompletionResponse=(\uresponse:AnyObject)->Void
如果let completion=self.completion{
完成(信息作为任何对象)
}
或者作为一行代码self.completion?(信息为AnyObject)
您还可以保留双选项
并使用展开(如果让
如果let completion=self.completion.flatMap({$0}){
完成(信息作为任何对象)
}
或者作为一行代码self.completion??(信息作为任何对象)
请注意,您必须将信息指定为AnyObject
,否则会出现另一个编译器错误。您的typealias CompletionResponse
是可选的
并且您的completion属性也是可选的
。当您打印完成类型时
,您可以看到它是一个双可选类型
:
print(type(of: self.completion)) //Optional<Optional<(AnyObject) -> ()>>
print(类型(of:self.completion))//可选<Optional<(AnyObject)->()>>
您要做的是调用completion
函数。但是,由于它被包装在一个可选
中,因此您告诉编译器在枚举可选
中调用一个函数。枚举不是函数类型,无法调用,这就是错误试图告诉您的
现在,有多种方法可以解决您的问题
对我来说最有意义的解决方案是从typealias CompletionResponse
中删除Optional
类型
typealias CompletionResponse=(\uresponse:AnyObject)->Void
如果let completion=self.completion{
完成(信息作为任何对象)
}
或者作为一行代码self.completion?(信息为AnyObject)
您还可以保留双选项
并使用展开(如果让
如果let completion=self.completion.flatMap({$0}){
完成(信息作为任何对象)
}
或者作为一行代码self.completion??(信息作为任何对象)
请注意,您必须将信息指定为AnyObject
,否则会出现另一个编译器错误。您有一个嵌套的可选对象。typealias
已经是可选类型。接下来,您的completion
属性被声明为可选属性。因此,您有两个可选级别要通过。您的typealias是可选的,并且您还将var completion
声明为可选的。编译器不知道如何使用双可选参数调用函数。在大多数情况下,实际变量声明只需要一个?
,而不是它们的类型别名。因此有一些解决方案-将完成的声明更改为变量完成:完成响应
,从typealias
中删除?
,或展开完成部分
两次。根据代码片段,我看不出typealias
包含可选内容的原因。它所做的一切就是通过强制您始终具有可选项来限制类型。同样,双重展开也是邪恶的。:)同意。我也会使用第一个解决方案。您有一个嵌套的可选。typealias
已经是可选类型。接下来,您的completion
属性被声明为可选属性。因此,您有两个可选级别要通过。您的typealias是可选的,并且您还将var completion
声明为可选的。编译器不知道如何使用双可选参数调用函数。在大多数情况下,实际变量声明只需要一个?
,而不是它们的类型别名。因此有一些解决方案-将完成的声明更改为变量完成:完成响应
,从typealias
中删除?
,或展开完成部分
两次。根据代码片段,我看不出typealias
包含可选内容的原因。它所做的一切就是通过强制您始终具有可选项来限制类型。同样,双重展开也是邪恶的。:)同意。我也同意第一个解决方案。你说得对!这也是纳森·希钦斯和萨玛的建议。谢谢你所做的一切,你是对的!还有这个