在 for-in 循环中使用字符串宽度的问题

Trouble using width for String in for-in cycle

我写了一个简单的代码:

extension String {
    func trailingSpaces (width: Int) -> String {
        var s = "\(self)"
        for i in count(s)..<width {
            s = s + " "
        }
        return s
    }

    func leadingSpaces (width: Int) -> String {
        var s = "\(self)"
        for i in count(s)..<width {
            s = " " + s
        }
        return s
    }
}

class ViewController: UIViewController {

    var users = ["Marco", "Gianni", "Antonio", "Giulio", "Franco"]
    var ages = [29, 45, 17, 33, 37]

    override func viewDidLoad() {
        super.viewDidLoad()

        var merged = [String: Int] ()
        var totalAge = 0.0

        for var i = 0; i < ages.count; i++ {
            merged[users[i]] = ages[i]
        }

        for user in sorted(merged.keys) {
            let age = merged[user]
            totalAge += Double(age!)
            let paddedUser = user.trailingSpaces(10)
            let paddedAge = "\(age)".leadingSpaces(3)
            println("\(paddedUser) \(age!)")
        }

        println("\n\(merged.count) users")
        println("average age: \(totalAge / Double(merged.count))")
    }
}

但我无法让它运行 leadingSpaces 功能,我不明白原因,它与其他可用的扩展功能完全相同。

它给出错误

fatal error: Can't form Range with end < start

运行时

如果您 运行 遇到此类问题,请始终对您正在使用的变量执行 println()

println("\(age)") 就在 let paddedAge = "\(age!)".leadingSpaces(3) 之前 揭示问题

age 是可选的,这意味着您正在尝试对具有此值 "Optional(17)"

String 进行填充

因此,您的 count(s) 大于 3,您的范围无效

您的变量 age 不是 Int - 它是可选的 - Int?。当您在行 totalAge += Double(age!)println("\(paddedUser) \(age!)") 中展开它时,您已经知道这一点 - 但您没有在失败的行 let paddedAge = "\(age)".leadingSpaces(3) 中展开它。传递给 leadingSpaces 的字符串不是“17”,而是 "Optional(17)",这就是填充函数失败的原因,因为长度大于请求的宽度。

话虽如此,正如评论员@milo256 指出的那样,Swift 只能向上迭代,因此除非您在填充函数中检查 width >= .count,否则它们会在某个时候崩溃.