无法将值类型“()”分配给字符串类型?

Posted

技术标签:

【中文标题】无法将值类型“()”分配给字符串类型?【英文标题】:Cannot assign value type '()' to type String? 【发布时间】:2017-07-25 17:20:58 【问题描述】:

我只是想从使用completionHandler 的请求中获取一些信息。问题是我需要包含来自代码其他部分的所有信息的数组,而且我似乎无法访问它。这是我访问数据的地方:

private func loadUserData(completionHandler: @escaping ([String]) -> ()) 
    // We're getting user info data from JSON response
    let session = Twitter.sharedInstance().sessionStore.session()
    let client = TWTRAPIClient.withCurrentUser()
    let userInfoURL = "https://api.twitter.com/1.1/users/show.json"
    let params = ["user_id": session?.userID]
    var clientError : NSError?
    let request = client.urlRequest(withMethod: "GET", url: userInfoURL, parameters: params, error: &clientError)
    client.sendTwitterRequest(request)  (response, data, connectionError) -> Void in
        if connectionError != nil 
            print("Error: \(connectionError)")
        
        
        do 
            let json = JSON(data: data!)
            if let userName = json["name"].string,
                let description = json["description"].string,
                let followersCount = json["followers_count"].int,
                let favouritesCount = json["favourites_count"].int,
                let followingCount = json["friends_count"].int,
                let lang = json["lang"].string,
                let nickname = json["screen_name"].string 
                
                    self.userData.append(userName)
                    self.userData.append(description)
                    self.userData.append(String(followersCount))
                    self.userData.append(String(favouritesCount))
                    self.userData.append(String(followingCount))
                    self.userData.append(lang)
                    self.userData.append(nickname)
                
                    completionHandler(self.userData)
            
        
    


func manageUserData(index: Int) 
    loadUserData() _ in 
        return self.userData[index]
    

这就是我需要这些数据来展示它的地方:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let rowNumber = indexPath.row
    let cellIdentifier = "TableViewCell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCellController else 
        fatalError("The dequeued cell is not an instance of TableViewCellController.")
    
    
    switch rowNumber 
        case 0:
            cell.titlePlaceholder.text = "Name:"
            cell.valuePlaceholder.text = manageUserData(index: 1)

在最后一行中出现错误:“无法将类型 '()' 的值分配给类型 String?。我不确定我是否正确使用了 completionHandler 来检索数据并确保我可以访问它来自代码的不同部分。

有什么想法吗? 非常感谢!

更新 我没有正确使用completionHandler。所以我改变了它:

private func loadUserData(completion: @escaping (_ myArray: [String]) -> Void)

所以我的 manageUserData 函数现在看起来像这样:

func manageUserData() 
    loadUserData 
        (result: [String]) in
        self.secondUserData = result
    

希望这会有所帮助!

【问题讨论】:

不清楚您的期望。您的 func manageUserData(index: Int) 不返回任何值。因此,您不能将其“分配”给标签的text;它不是文字。它不是字符串。这是一个 Void(没有价值)。 【参考方案1】:

由于这是异步网络调用,您应该在 VC 的 viewWillAppearviewDidAppearviewDidLoad 中启动此调用 -- 取决于您是否需要重新加载数据。

override func viewWillAppear(_ animate: Bool) 
    super.viewWillAppear(animate)
    sessionManager.loadUserData  (strings) in

    

然后在调用完成时将运行的 loadUserData 闭包中,将数据加载到用作 tableView 数据源的数组中并调用 tableView.reloadData()

sessionManager.loadUserData  (strings) in 
    self.dataSource = strings
    self.tableView.reloadData()

那么对于您的cellForRow,您只需要:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let rowNumber = indexPath.row
    let cellIdentifier = "TableViewCell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TableViewCellController else 
        fatalError("The dequeued cell is not an instance of TableViewCellController.")
    

    switch rowNumber 
        case 0:
            cell.titlePlaceholder.text = "Name:"
            cell.valuePlaceholder.text = dataSource[0]
    

确保您的 numberOfRows 正在返回 dataSource.count

【讨论】:

以上是关于无法将值类型“()”分配给字符串类型?的主要内容,如果未能解决你的问题,请参考以下文章

出现错误:参数类型“产品”无法分配给参数类型“地图<字符串,动态>

参数类型“字符串?”不能分配给参数类型“字符串”

如何正确地将值分配给数组(结构类型)元素?

类型“”不可分配给类型“JwtConfig”

错误:无法分配类型“字符串?”的值键入“字符串?。类型”

错误:参数类型“字符串?”不能分配给参数类型“字符串”