繁体   English   中英

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

[英]fatal error: Array index out of range Swift

在此示例中,我将创建一个新的Int空数组,并希望将另一个数组中的某些字符添加到其中。 最初,在我的characters数组中,我存储数字["1","","2","","3"]然后在此数组中(我可能完全错了),我想遍历这些数字以产生一个具有这些数字[1,2,3]newarray (本质上是删除它们之间的空格并使它们成为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")
    }   
}

从该线程中的其他注释来看,您似乎正在尝试从看起来像"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

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

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

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

发生这种情况是因为您的newarray没有容量。

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

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

PS还请注意,您在for循环中犯了一个错误,应该使用<而不是<=并且在循环内忙于迭代器值是一个坏主意,在看到一个空格时将此var递增两次,确定要这样做吗?

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

使用for-in+= 这将使您的代码更加敏捷。

根据您在注释中告诉的内容(您想要从数组中删除空格字符并获取新的字符),可以这样实现:

let newarray = characters.filter { $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)

更改此行:

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

对此:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM