swift函数返回nil(返回得太早)

时间:2019-05-27 11:50:21

标签: swift

我在ViewDidLoad函数中有一些代码,该代码将在其调用堆栈的末尾设置一个类变量。我试图将代码重构为一个单独的函数,该函数将返回值而不是设置类变量。

由于我缺乏快速的知识,所以我不确定问题出在哪里,好像我的函数返回的太早了,正如我可以在调试器中告诉的那样,在将shareURL设置为publicUrl.absoluteString

func getShareUrl() -> String? {
    var shareURL: String?
    if let extItem = extensionContext?.inputItems.first as? NSExtensionItem,
      let itemProvider = extItem.attachments?.first as? NSItemProvider,
      itemProvider.hasItemConformingToTypeIdentifier("public.url") {
      itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
        if let publicUrl = url as? URL {
          shareURL = publicUrl.absoluteString
        }
      }
    }
    return shareURL
  }

我还可以在调试器中看到,在主函数返回之后,稍后会调用内部函数。

如何在返回之前等待内部调用完成?或正确的快速方法是什么?

1 个答案:

答案 0 :(得分:3)

您需要完成,因为方法itemProvider.loadItem(forTypeIdentifier是异步的

func getShareUrl(completion:@escaping (String?) -> ()) {
    if let extItem = extensionContext?.inputItems.first as? NSExtensionItem,
        let itemProvider = extItem.attachments?.first as? NSItemProvider,
        itemProvider.hasItemConformingToTypeIdentifier("public.url") {
        itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
            if let publicUrl = url as? URL {
                completion(publicUrl.absoluteString)
            } else {
                completion(nil)
            }
        }
    }
}