Arrays Swift致命错误:数组索引超出范围

Arrays Swift致命错误:数组索引超出范围,arrays,swift,Arrays,Swift,如何修复此代码,使我不再出现错误。我得到的错误是致命错误:数组索引超出范围。代码检查字符串中有多少个x和o var input = "xxxoxoooxoxo" var inputString = Array(input.characters) var XString = "" var OString = "" for var i = 0; i <= inputString.count; ++i { if inputString[i] == "x" {

如何修复此代码,使我不再出现错误。我得到的错误是致命错误:数组索引超出范围。代码检查字符串中有多少个x和o

var input = "xxxoxoooxoxo"

var inputString = Array(input.characters)

var XString = ""

var OString = ""

for var i = 0; i <= inputString.count; ++i {

    if inputString[i] == "x" {

        XString.append(inputString[i])

    }

    else if inputString[i] == "o" {

        OString.append(inputString[i])

    }

}

if XString.characters.count == OString.characters.count {

    print("equal")

}

else {

    print("Not Equal")

}
谢谢您的帮助。

更换此

for var i = 0; i <= inputString.count; ++i
为此:

for var i = 0; i < inputString.count; ++i

数组是零索引的。这意味着第一个元素的索引为0。第二个元素的索引为1。最后一个元素具有索引数组。count-1。

@dasdom是正确的。但这里有一个更快捷的方法:

// input string
var input = "ooooxxxxxxxoxoooxoxo" 

// difference between number of x's and number of o's
var diff = 0 

// perform this function for each character in `input.characters`:
input.characters.forEach {
    switch $0 // $0 is the argument to our function (unnamed)
    {
        case "x": diff += 1          // x's are +1
        case "o": diff -= 1          // o's are -1
        default: fatalError()        // we expect only 'x' or 'o'... if we get something else, just crash
    }
}

// use the ternary (?:) operator to print the answer.
// (<result> = <condition> ? <if-true value> : <if-false value>)
print( diff == 0 ? "equal" : "not equal" )

您正在枚举传递数组的范围。用这个代替

for var i = 0; i < inputString.count; ++i {

虽然每个人都在给你一个选择,但我认为这也是一个不错的补充:

var input = "xxxxxoxoooxoxo"
您可以使用过滤器获取计数:

在您的情况下,使用reduce会更高效,而且更短:

let result = input.characters.reduce(0) { $0 + ($1 == "x" ? 1 : -1) }

print(result == 0 ? "equal" : "not equal") // not equal
仅当您确定输入仅包含x和o时,才使用此选项。如果没有,则必须将评估更改为:

{ $0 + ($1 == "x" ? 1 : $1 == "o" ? -1 : 0) }

如果你的目标是计数,为什么要构造新的字符串呢?请记住,循环的标准在swift 2.2中会被弃用,在3.0中会被删除,就像我相信的那样。哈哈,很好的一个!我真的很喜欢在这里使用字典。我会用??0而不是隐式展开它:也许我应该在我的答案中添加它!:p第二个版本很有趣,但我认为对于一个在数组中的元素数量上苦苦挣扎的人来说,这是非常有趣的;我使用强制展开来捕获无效字符。。。但是如果你不在乎,那么??0当然可以。我想知道,假设输入有1000多个字符。为每次迭代创建一个字典的成本有多高?你有什么想法吗?希望不会每次都被创建,因为这是一个文字?但如果这是一个问题,字典可以在闭包之外创建。。。
let xCount = input.characters.filter { $0 == "x" }.count
let oCount = input.characters.filter { $0 == "o" }.count

print( xCount == oCount ? "equal" : "not equal" )
let result = input.characters.reduce(0) { $0 + ($1 == "x" ? 1 : -1) }

print(result == 0 ? "equal" : "not equal") // not equal
{ $0 + ($1 == "x" ? 1 : $1 == "o" ? -1 : 0) }