【问题标题】:Inserting items into an empty array将项目插入空数组
【发布时间】:2016-02-13 05:09:43
【问题描述】:

我不完全确定这是否可能。我从一个空数组开始。我有一个表格视图,每个都有不同的数字。当用户单击一个单元格时,所选数字将附加到数组中。

现在,我面临的问题是用户可以按任何顺序单击任何单元格,但我需要对数组进行排序,以便单元格 1 与索引 1 匹配,单元格 2 与索引 2 匹配,依此类推。

到目前为止,我尝试的是追加。但这会乱序插入数字。我试过插入,但是在第一次选择后会抛出一个错误,说明索引超出范围。

编辑:

我有一个 tableView,其中的数字按数字顺序排列: 1, 2 , 3 , 4 ... 用户单击一个数字,该数字将附加到数组中。

用户可以按任意顺序选择任意数字,例如:1, 3, 4, 2 .. 最后我会得到一个 [1,3,4,2] 的数组。我需要对数字进行排序,以便如果用户选择 3,它将最终出现在数组的第三个索引中。

感谢任何帮助

【问题讨论】:

  • 请发布您的代码。也不确定我是否理解这里的问题。您是否要计算单击单元格的次数?
  • 你的问题现在很混乱。请发布一些代码,以便我们了解您的要求。
  • 我有一个tableView,其中的数字按数字顺序排列: 1, 2 , 3 , 4 ... 用户单击一个数字,该数字将附加到数组中。
  • 用户可以按任意顺序选择任意数字,例如:1, 3, 4, 2 .. 最后我会得到一个 [1,3,4,2] 的数组。我需要对数字进行排序,这样如果用户选择 3,它就会出现在数组的第三个索引中。
  • 如果用户多次点击编号为2的单元格怎么办?您希望数组中的值是唯一的吗?

标签: arrays swift swift2


【解决方案1】:

Arrayappendsort 函数应该可以很好地满足您的描述:

// Use `var`, not `let` - you're going to change this value over time!
var tappedNumbers: [Int] = []

// You can then append numbers in order, like this:
tappedNumbers.append(2)
tappedNumbers.append(5)
tappedNumbers.append(1)

tappedNumbers.sort() // this returns the array [1, 2, 5]


// If you don't want duplicates, try using Set instead of Array:
var tappedSet: Set<Int> = []
tappedSet.insert(2)
tappedSet.insert(5)
tappedSet.insert(1) 
tappedSet.insert(5) // see, we're double-inserting 5 here...

tappedSet.count // returns 3, because there are only 3 unique entries

tappedSet.sort() // returns [1, 2, 5]

将此代码放入 Swift Playground 并自己尝试一下 - 这就是您所描述的吗?

【讨论】:

  • 我认为 OP 希望数组索引与单元格索引相同,如果是这样,我的答案就是我认为 OP 想要的
  • 我不明白为什么这是可取或必要的 - 但是,¯_(ツ)_/¯
【解决方案2】:

我不确定您将如何使用您的数组,但我不建议您使用自己的答案。

您可以使用Dictionary:而不是创建固定大小的数组:

var dict: [Int: Int] = [:]

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    dict[indexPath.row +1] = indexPath.row + 1
}

【讨论】:

    【解决方案3】:

    您可以尝试从NSNull 对象的数组开始,该数组的大小与表视图中的行数相同。然后当用户选择行时,将该索引处的NSNull 替换为所选数字。

    NSNull:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNull_Class/

    【讨论】:

    • 要创建一个与行数相同大小的NSNull 数组,我会这样做:[NSNull, NSNull, NSNull, NSNull]... 假设我的 tableview 有 4 行
    【解决方案4】:

    假设您要求的是一种将单元格的索引与单元格的值联系起来的方法,那么您应该这样做。不要使用数组中单元格位置的值作为单元格索引,而是使用包含单元格索引和单元格值的字典或元组数组。这是一个例子:

    var myDict = Dictionary<Int,Int>()
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    
        let cellvalue = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text
        myDict.append((index: indexPath.row, value: cell value))
    
    } 
    

    或使用元组:

    typealias myTuple = (index: Int, value: Int)
    var myTupleArray = Array<myTuple>()
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    
        let cellvalue = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text
        myDict.append((index: indexPath.row, value: cell value))
    
    } 
    

    【讨论】:

      【解决方案5】:

      对于任何寻找答案的人.. 下面的代码将创建一个包含 4 个 nil 占位符的数组。

      var array = [Int?](count: 4, repeatedValue: nil)

      在我使用的正确索引处获取所选项目

      array[indexPath.row] = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text

      【讨论】:

      • 我同意重复 nil 并不聪明。相反我选择重复 0
      • 取决于你想如何使用你的数组,也许我的回答会更好。 (反正更安全)
      • 我认为@Eendje 在这里有最好的答案,因为您真正想要的是键值关系,而不是有序集合。顺便说一句,您不应该使用cellForRowAtIndexPath(indexPath)!,因为该方法有时会返回nil(例如,如果单元格不可见),它会使您的应用崩溃。
      【解决方案6】:

      我同意@bryanjclark。

      我不确定创建一个充满“nil”的数组(正如您在自己的答案中所建议的那样)是理想的解决方案。

      再次,正如@bryanjclark 建议的那样,我会使用Set

      var indexSet:Set<Int> = []
      
      // click on index 1
      indexSet.insert(1)
      // click on index 5
      indexSet.insert(5)
      
      // get all clicked cell indexes back in order
      let sortedIndexes = indexSet.sort()
      
      // check if a index is in the clicked set
      if indexSet.contains(3) {
          print("contains")
      } else {
          print("does not contain")
      }
      

      【讨论】:

      • 他似乎希望该值与索引路径相对应,例如[1, nil, nil, 4].
      • 这可能是他想要的,但我不确定这是不是正确的编码方式。如果表格视图中有 10,000 个单元格怎么办?数组是否应该包含 10,000 个nil 值?也许使用集合可以达到相同的结果——对于(可能)对 Swift 不熟悉的人来说——也许挑战他们的假设是件好事。
      • 这就是字典的用途 ;)
      • 虽然,这里我们只存储key,而不是keyvalue ;)
      • 是的,但如果他想检查用户是否按下了2 并使用了print(indexSet[2]),它可能会返回不需要的结果(可能是234) .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多