无法将值类型“()”分配给 String 类型?
Cannot assign value type '()' to type String?
我只是想使用 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
}
}
希望对您有所帮助!
由于这是异步网络调用,您应该在 VC 的 viewWillAppear
、viewDidAppear
或 viewDidLoad
中启动此调用——具体取决于您是否需要重新加载数据。
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
我只是想使用 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
}
}
希望对您有所帮助!
由于这是异步网络调用,您应该在 VC 的 viewWillAppear
、viewDidAppear
或 viewDidLoad
中启动此调用——具体取决于您是否需要重新加载数据。
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