首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Swift中的闭包接收方法的输出?

如何从Swift中的闭包接收方法的输出?
EN

Stack Overflow用户
提问于 2021-12-04 08:36:38
回答 2查看 125关注 0票数 0

如何接收TweetSentimentClassifierInput对象数组的输出以将其进一步发送到我的预测模型?

我有数组,但在闭包中,这使得它无法作为方法输出返回。如果我在闭包之外初始化一个空数组,那么输出总是一个空数组,因为fetch闭包需要时间才能完成。

代码

代码语言:javascript
复制
struct TweetFetcher {

   let tweetCount = 100
   let swifter = Swifter(consumerKey: key, consumerSecret: secret)

func fetchTweets(with searchText: String) -> [TweetSentimentClassifierInput] {
    
    swifter.searchTweet(using: searchText, lang: "en", count: tweetCount, tweetMode: .extended) {(results, searchMetadata) in
        var tweets = [TweetSentimentClassifierInput]()
        let data = results.description.data(using: .utf8)

        do {
            let decodedData = try JSONDecoder().decode([TweetData].self, from: data!)
        } catch {
            print("Error with decoding, \(error)")
        }

        for tweet in decodedData {
            let tweetForClassification = TweetSentimentClassifierInput(text: tweet.full_text)
            tweets.append(tweetForClassification)
        }
    } failure: { (error) in
        print("Error with the Twitter API request, \(error)")
    }
}
}

如何从闭包返回非空数组作为方法输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-04 09:24:51

您应该使用completionHandler概念来实现这样的异步操作:

代码语言:javascript
复制
struct TweetFetcher {
    let tweetCount = 100
    let swifter = Swifter(consumerKey: key, consumerSecret: secret)
    
    func fetchTweets(with searchText: String, completion: @escaping ([TweetSentimentClassifierInput]?, Error?) -> Void) {
        
        swifter.searchTweet(using: searchText, lang: "en", count: tweetCount, tweetMode: .extended) {(results, searchMetadata) in
            var tweets = [TweetSentimentClassifierInput]()
            let data = results.description.data(using: .utf8)
            
            do {
                let decodedData = try JSONDecoder().decode([TweetData].self, from: data!)
            } catch {
                print("Error with decoding, \(error)")
                completion(nil, error)
            }
            
            for tweet in decodedData {
                let tweetForClassification = TweetSentimentClassifierInput(text: tweet.full_text)
                tweets.append(tweetForClassification)
            }
            completion(tweets, nil)
        } failure: { (error) in
            print("Error with the Twitter API request, \(error)")
            completion(nil, error)
        }
    }
}

用法

代码语言:javascript
复制
let fetcher = TweetFetcher()
fetcher.fetchTweets(with: "Keyword...") { tweets, error in
    if let error = error {
        print(error.localizedDescription)
    } else {
        // Use tweets array content here ...
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-04 08:45:05

在异步中转换此方法,以[TweetSentimentClassifierInput]作为闭包参数传递闭包,并将错误作为辅助闭包参数,

代码语言:javascript
复制
func fetchTweets(with searchText: String, finished: ((_ sentiments: [TweetSentimentClassifierInput]?,_ error: Error?) -> Void)) {

    swifter.searchTweet(using: searchText, lang: "en", count: tweetCount, tweetMode: .extended) {(results, searchMetadata) in
        var tweets = [TweetSentimentClassifierInput]()
        let data = results.description.data(using: .utf8)

        do {
           let decodedData = try JSONDecoder().decode([TweetData].self, from: data!)
           } catch {
           print("Error with decoding, \(error)")
        }

        for tweet in decodedData {
            let tweetForClassification = TweetSentimentClassifierInput(text: tweet.full_text)
            tweets.append(tweetForClassification)
        }
        finished(tweets, nil)
    } failure: { (error) in
        print("Error with the Twitter API request, \(error)")
        finished(nil, error)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70224151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档