Swift 函数返回空值

Swift 函数返回空值,swift,function,return-value,Swift,Function,Return Value,这可能是一个基本问题,但我无法理解。我的函数总是返回空值,我不知道为什么 我的主代码(在另一个视图控制器中)使用“字符串”调用此函数进行搜索。但是在函数的末尾,我永远无法返回结果。如果我将搜索结果打印到有最终打印语句的位置,那么我确实会看到结果。但函数完成后,返回值为零。如何从该函数中获取返回值?提前谢谢,。我正在使用Swift btw func fetchSearchResults (_ searchString: String) -> Array<Any> {

这可能是一个基本问题,但我无法理解。我的函数总是返回空值,我不知道为什么

我的主代码(在另一个视图控制器中)使用“字符串”调用此函数进行搜索。但是在函数的末尾,我永远无法返回结果。如果我将搜索结果打印到有最终打印语句的位置,那么我确实会看到结果。但函数完成后,返回值为零。如何从该函数中获取返回值?提前谢谢,。我正在使用Swift btw

 func fetchSearchResults (_ searchString: String) -> Array<Any> {
        self.globalPost = [Posts]()
        self.postKeysArray = []
        var searchIndex:AlgoliaSearch.Index
        let query = Query()
        searchIndex = self.client.index(withName: "Comments")
//但这里我得到一个空值

        return self.postKeysArray \\ returns empty array

    }

正如Alexander所指出的,您正在完成处理程序中打印搜索结果,当
fetchSearchResults
返回时,该处理程序尚未执行。有几种不同的方法可以解决这个问题。一种方法是重构
fetchSearchResults
,以结束:

func fetchSearchResults (_ searchString: String, completionHandler completion: (Array<Any>) -> ()) {
    // ...
    searchIndex.search(query, completionHandler: { (content, error) in
        // ...
        self.postKeysArray = tmp
        self.getDatafromFirebase(searchString)
        // so my search code returns some values here and i see them in the post keysArray.

        print ("Search Results -post keys is \(self.postKeysArray)")  \\ returns correct values here in the Array
        completion(self.postKeysArray)
    })
}
您现在可以:

searchController.fetchSearchResults(searchString, { results in
    doSomething(results)
})
这一行也可以写成:

searchController.fetchSearchResults(searchString, doSomething)
如果确实无法使fetchSearchResults异步,则可以使用
DispatchSemaphore
等待完成处理程序完成:

func fetchSearchResults (_ searchString: String) -> Array<Any> {
    // ...
    var semaphore = DispatchSemaphore(0)
    searchIndex.search(query, completionHandler: { (content, error) in
        // ...
        self.postKeysArray = tmp
        self.getDatafromFirebase(searchString)
        // so my search code returns some values here and i see them in the post keysArray.

        print ("Search Results -post keys is \(self.postKeysArray)")  \\ returns correct values here in the Array
        semaphore.signal()
    })
    semaphore.wait()
    return self.postKeysArray
}
func fetchSearchResults(searchString:String)->数组{
// ...
var信号量=调度信号量(0)
searchIndex.search(查询,completionHandler:{(内容,错误)在
// ...
self.postKeysArray=tmp
self.getDatafromFirebase(searchString)
//所以我的搜索代码在这里返回一些值,我在PostKeysArray中看到它们。
打印(“搜索结果-post键为\(self.postKeysArray)”\\在数组中返回正确的值
信号量
})
信号量。等待()
返回self.postKeysArray
}

请注意,除非您知道自己在做什么,否则使用信号量不是一个好主意。如果您不知道可以调用哪些线程和各种回调,则可能会导致死锁。如果在与
fetchSearchResults
相同的
DispatchQueue
上调用
searchIndex.search
完成处理程序,则上述示例将不起作用。如果你不明白我在说什么,你可能不应该这么做。几乎可以肯定,使用异步回调会更好。

当您说“null”时,是指
nil
还是空数组?如果是后者,那是因为它在完成处理程序完成之前返回。它是一个空数组,但我确实在完成处理程序中得到打印结果。@SBCoder没有“null”关于一个空数组。@SBCoder它是空的,因为您在竞争处理程序添加到它之前返回了数组。非常感谢您。我使用了你推荐的代码。需要一些时间来理解它,但再次非常感谢。顺便说一句,有没有我可以联系到你的电子邮件/推特?我应该在GitHub@jumhyn上有一封电子邮件。
searchController.fetchSearchResults(searchString, { results in
    doSomething(results)
})
searchController.fetchSearchResults(searchString, doSomething)
func fetchSearchResults (_ searchString: String) -> Array<Any> {
    // ...
    var semaphore = DispatchSemaphore(0)
    searchIndex.search(query, completionHandler: { (content, error) in
        // ...
        self.postKeysArray = tmp
        self.getDatafromFirebase(searchString)
        // so my search code returns some values here and i see them in the post keysArray.

        print ("Search Results -post keys is \(self.postKeysArray)")  \\ returns correct values here in the Array
        semaphore.signal()
    })
    semaphore.wait()
    return self.postKeysArray
}