在 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,否则它们会在某个时候崩溃.
我写了一个简单的代码:
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,否则它们会在某个时候崩溃.