我刚刚开始用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)
}
答案 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
捕获任何无效输入并防止它成为选项数组。)
此外,为了您的理智以及之后可能需要阅读您的代码的任何人,请避免使用几乎相同的变量名称,例如sortedNumbers
和sortedNubers
。如果您需要对同一数据使用多个变量,请使它们的差异更具描述性(例如,在这种情况下,第一个应该是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
以区域设置感知方式处理转化。