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

时间:2016-03-17 17:43:43

标签: ios swift

在这个例子中,我正在创建一个新的Int空数组,我想将其他数组中的某些字符添加到其中。最初,在我的characters数组中,我存储数字["1","","2","","3"]并且在这个数组中(我可能这样做完全错了)我想迭代这些数字以生成一个newarray,这将有这些数字[1,2,3](基本上删除其间的空格并使其类型为Int

据我了解,我创建了一个动态数组,即没有特定的大小,但我收到此错误:fatal error: Array index out of range我不知道为什么。有人可以为我澄清一下吗?感谢

 do{
        var data = try String(contentsOfFile: documentsDirectoryPath as String,
            encoding: NSASCIIStringEncoding)
        print(data)
        let characters = Array(data.characters)
        print(characters)
        var newarray = [Int]()

        for var index = 0; index <= characters.count ; ++index {
            if characters[index] == " " {
                index++
            }
            else{
                newarray[index] = index
            }
        }
        print(newarray)    
    }
    catch{

        print("error")
    }   
}

6 个答案:

答案 0 :(得分:2)

根据您在此主题中的其他评论,您可能会尝试从类似"1, 2, 3"的字符串中过滤掉空格逗号。如果这是错误的,请纠正我。对此的完全 swifty 解决方案如下:

do {
    var data = try String(contentsOfFile: documentsDirectoryPath as String, encoding: NSASCIIStringEncoding)
    print(data)

    let newarray = data.characters.filter { Int(String($0)) != nil }.map { Int(String($0))! }    
} catch {
    print("error")
}   

解释

filter将返回一个转换为整数的Character数组。然后map将获取该数组,然后将每个元素转换为整数。我们必须将Character转换为String类型,因为没有Int构造函数需要Character

答案 1 :(得分:1)

您的代码中存在多个问题,其中最重要的是您的方法不正确,因为它将字符串视为单个字符的集合,而您的问题则需要解析多位数字。

更好的方法是在逗号上拆分数组,并从修剪后的结果中解析整数,如下所示:

let data = "12, 23, 345"
print(data)
let newarray = data.characters.split(){$0 == ","}.map{
    Int(String.init($0).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()))!
}
print(newarray) // 12, 23, 345

答案 2 :(得分:0)

这是因为您的newarray没有容量。

尝试使用append方法或创建具有如下容量的数组:

let newarray = [Int](count:charactes.count, repeatedValue: 0)

P.S。还要注意你在for循环中有错误,你应该使用<而不是<=并且在循环中使用迭代器值是一个坏主意,当你看到一个空格时,你将这个变量增加两次,你确定这是有意的吗?

你在Swift中使用了两种不好的做法。首先,使用类似C的for循环,它将在Swift 3中删除。++运算符也是如此。他们也将被删除。

改为使用for-in+=。这将使你的代码更加迅捷。

答案 3 :(得分:0)

根据你在评论中说的内容(你想从数组中删除空格字符并获取新的字符),你可以这样实现:

let newarray = characters.filter { $0 != " " }

答案 4 :(得分:0)

另一种方法:

首先删除String中的所有空格,然后将其转换为Array

let trimmedData = data.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
let characters = Array(trimmedData.characters)

编辑:如果您只想保留数字:

let validNumbers = "1234567890"
let validSet = NSCharacterSet(charactersInString: validNumbers)
let trimmedData = data.stringByTrimmingCharactersInSet(validSet)
let characters = Array(trimmedData.characters)

答案 5 :(得分:0)

更改此行:

for var index = 0; index <= characters.count ; ++index {

到这一个:

for var index = 0; index < characters.count ; ++index {