如何在此 for 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int'

Posted

技术标签:

【中文标题】如何在此 for 循环中修复\'无法将\'String\'类型的值转换为预期的参数类型\'Int\'【英文标题】:How can I fix 'Cannot convert value of type 'String' to expected argument type 'Int' in this for loop如何在此 for 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int' 【发布时间】:2016-09-17 22:14:54 【问题描述】:

经过数小时试图找到答案,我被官方难住了。

我有一个字符串数组:

let artists = ["Robben Ford", "Joe Bonamassa", "Eric Clapton", "Matt Schofield"]

现在我想像这样迭代那个数组:

func refresh() 
    for artist in artists 
       let indexPath = NSIndexPath(forItem: artist, inSection: 0) <---- Error
       if let cell = tableView.cellForRowAtIndexPath(indexPath) 
          cell.textLabel?.text = artist
      

Xcode 在 let indexPath 语句中抱怨“无法将 'String' 类型的值转换为预期的参数类型 'Int'。我知道它期望 forItem 是一个 Int 但我不知道如何使它成为一个。

我确实尝试将 for 循环更改为

for artist in artists.enumerate() 
     

但它只是说它不能隐藏'(index: Int, element: String)'。

解决方法对非初学者来说一定很明显,但对我来说并不明显。

提前致谢。

【问题讨论】:

仅供参考。您的 refresh() 不是更新单元格的方法。您需要实现 UITableViewDataSource 所需的方法。见developer.apple.com/library/ios/documentation/UIKit/Reference/… 嗨,Daniel,我正在编写有关附件视图的教程,该教程实现了此刷新方法,以确保在用户选择不同的行时使用复选标记更新行。我在帖子中删除了那部分代码以简化我的示例。我也在实现创建 tableView 单元格所需的三种方法。不过感谢您的评论。 【参考方案1】:

它不起作用,因为您传递的是字符串,而不是字符串的索引。试试看

for (index, artist) in artists.enumerate()

然后传入索引。

【讨论】:

我喜欢这种语法。这是 for in 循环与 for 在一系列索引上循环的功能的便利。【参考方案2】:

初学者的解决方法很简单:

for artist in artists.enumerate() 
    let indexPath = NSIndexPath(forItem: artist.index, inSection: 0)
    if let cell = tableView.cellForRowAtIndexPath(indexPath) 
        cell.textLabel?.text = artist.element
    

问题在于,您试图将“艺术家”String 传递给 NSIndexPath(forItem: Int, inSection: Int) 初始化程序的 forItem 参数。如您所见,它需要 2 个Int 参数。所以@Ahaubster 的答案是正确的,你只是错过了他的最后一句话。

【讨论】:

对不起,我在那里犯了一个小错误。现在应该编译。 你仍然错过了element,但我已修复它。

以上是关于如何在此 for 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int'的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 不在不同的线程中运行这个 for 循环,我该如何修复它

在 Python 中将列表理解转换为 For 循环

window无法完成安装,若要在此计算机上安装window

java将list集合中的for数据循环添加到String数组中

如何修复“在 C99 模式外使用的 for 循环初始声明”GCC 错误?

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;