Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 与代表迅速结束对话_Swift_Delegates_Closures - Fatal编程技术网

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
    包含可选内容的原因。它所做的一切就是通过强制您始终具有可选项来限制类型。同样,双重展开也是邪恶的。:)同意。我也同意第一个解决方案。你说得对!这也是纳森·希钦斯和萨玛的建议。谢谢你所做的一切,你是对的!还有这个