如何在Xcode中对键入TextField的Integer值进行排序?

时间:2017-05-15 17:38:15

标签: ios arrays swift sorting

我刚刚开始用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)
    }

3 个答案:

答案 0 :(得分:0)

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

@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)
}

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

你的错误在于试图将单个字符串视为一个数字数组。你错过了两个步骤:

  • 解析:取用户输入的字符串并将其转换为数字
  • 格式化:获取存储的数字并将其重新转换为字符串以显示

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

@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以区域设置感知方式处理转化。