【问题标题】:How do I sort Integer values typed into a TextField in Xcode?如何在 Xcode 中对输入到 TextField 的整数值进行排序?
【发布时间】:2017-05-15 17:38:14
【问题描述】:

我刚刚开始使用 Swift 进行一些简单的编程,比如构建一个简单的计算器之类的东西。现在我想创建一个应用程序,允许我对用户在 TextField 中输入的一堆整数值进行排序。下面是我到目前为止所得到的。你能告诉我我的错误在哪里吗?

class ViewController2: UIViewController {
    @IBOutlet var randomNumbers: UITextField!
    @IBOutlet var finalResult: UITextView!

    @IBAction func SortNumbers(_ sender: UIButton) {
        let sortedNumbers = Int[randomNumbers.text]
        let sortedNubers = sortedNumbers.sort{$1>$2}
        finalResult.text = String(sortedNumbers)
    }

【问题讨论】:

  • 第一件事 - 请使用标准命名约定。它将使您的代码更具可读性。类名以大写字母开头。变量和函数名称以小写字母开头。
  • @J.Ross 有什么错误吗?
  • 你的阵列在哪里?如果要对数字列表进行排序,则实际上需要一个数组。您所拥有的只是一个文本字段,这意味着您只有一个数字。无需对单个数字进行排序。
  • @TusharSharma 是的,有一个“Swift 编译器错误”说类型“Int.Type”没有下标成员。
  • 你可能想看看这个。 Swift Sort Arrays

标签: ios arrays swift sorting


【解决方案1】:

这不是您能得到的最佳答案,但它可能会解决您的问题:

@IBAction func sortNumbers(_ sender: UIButton) {
    let stringWithNumbers = "1 23 12 4 5 12"
    let sortedNumbers = stringWithNumbers.components(separatedBy: " ").flatMap { Int($0) }
    let sortedNubers = sortedNumbers.sorted { $0 > $1 }
    print(sortedNubers.description)
}

【讨论】:

  • 哦,非常感谢,现在可以了!这似乎是一个愚蠢的问题,但 .flatMap{Int($0)} 是什么意思?
【解决方案2】:

您没有正确地将其转换为 Int 数组。如果我们可以假设输入字符串是一个没有空格的逗号分隔列表:

let sortedNumbers = randomNumbers.text.components(separatedBy: ",").map{ Int($0) ?? 0 }

components 使用逗号作为引用将其拆分为字符串数组,然后map 将每个元素转换为 Int(?? 0 捕获任何无效输入并防止其成为可选数组)。

另外,为了您和以后可能需要阅读您的代码的任何人的理智,请避免使用几乎相同的变量名称,例如 sortedNumberssortedNubers。如果您需要对同一数据使用多个变量,请使它们的差异更具描述性(例如,在这种情况下,第一个变量可能应该是 unsortedNumbers)。

【讨论】:

    【解决方案3】:

    您的错误在于尝试将单个字符串视为数字数组。您缺少两个步骤:

    • 解析:将用户输入的字符串转化为数字
    • 格式化:取出存储的数字,转回字符串显示

    潜伏在第一步的是用户实际上没有输入整数的可能性。忽略非整数输入的方法如下所示:

    @IBAction func sortTextAction(_ sender: UIButton) {
      guard let text = randomNumbers.text else {
        finalResult.text = ""  // clear out - no result on empty input
        return
      }
    
      // Parse String -> [Int]:
      // Split into words, then turn words into Ints,
      // while discarding non-Int words
      let words = text.components(separatedBy: CharacterSet.whitespacesAndNewlines)
      let numbers = words
        .map({ Int($0) })  // String -> Int?
        .flatMap({ $0 })  // discard any nil values
    
      let sorted = numbers.sort()
    
      // Format [Int] -> String: glue the sorted Ints together with a space between each
      finalResult.text = sorted
        .map({ String(describing: $0 })  // Int -> String: turn 1 into "1"
        .joined(separator: " ")  // [String] -> String: turn [1, 2, 3] into "1 2 3"
    }
    

    }

    隐藏在这两者背后的是本地化:一个语言环境写为“1,000”的内容可能在其他地方是“1 000”或“1.000”。为此,您需要使用NumberFormatter 以识别区域设置的方式处理转换。

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多