我正在尝试创建一种算法,该算法基本上可以找到给定单词的字谜(下面的代码)。用户输入他们的单词后,他们按下一个按钮,它应该做的是查看一组单词(从 txt 文件填充;我知道这部分有效),并为每个单词取第一个字母并查看是否用用户的话来说,我使用了 caseInsensitiveCompare 来完成。如果在用户键入的单词中找到了初始单词中的所有字母,它应该将该单词添加到 NSMutableArray。但是,当我尝试运行它时,通过询问可变数组中的第一个单词进行测试时,出现以下错误:
2014-08-07 13:56:52.231 HelloNoun[14796:60b] * 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM objectAtIndex:]:索引 0空数组越界'
这对我来说意味着没有单词被添加到可变数组中。我不明白这一点,因为用户词本身至少应该与当前代码一起出现。我查看了所有我认为可能出错的文档,并尝试通过 Google 搜索答案,但我仍然不明白为什么这不起作用。
我对编码非常陌生,因此非常感谢任何对此问题的帮助或关于我应该以不同方式做的事情(包括关于这篇文章)的提示。
代码:
- (IBAction)setOutput:(id)sender {
NSString *lettersAvailableImmutable = self.userInput.text;
NSMutableString *lettersAvailable;
NSMutableArray *matches = [[NSMutableArray alloc] initWithCapacity:1];
lettersAvailable = lettersAvailableImmutable];
for (NSString *string in words)
{
int len = string.length;
int runningTotal = 0;
for (int i = 0; i < len; i++){
NSString *currentChar = [string substringWithRange: NSMakeRange (i, 1)];
int lettersAvailableLength = lettersAvailable.length;
for (int j = 0; j < lettersAvailableLength; j++){
NSString *currentInputChar = [lettersAvailable substringWithRange:NSMakeRange (j, 1)];
if( [currentChar caseInsensitiveCompare:currentInputChar] == NSOrderedSame ) {
[lettersAvailable deleteCharactersInRange: NSMakeRange (j, 1)];
runningTotal++;
lettersAvailableLength--;
}
else {
continue;
}
}
}
if (runningTotal == len){
[matches addObject:string];
}
}
self.userOutput.text = [matches objectAtIndex:0];
}
最佳答案
如果 runningTotal
从不 ==
到 len
,则不会将任何对象添加到 matches
。
在空数组上调用索引为 0 的 objectAtIndex:
将产生该异常。
initWithCapacity:1
不会创建一个有一个空槽的数组;它只是建议 Foundation 应该优化数组以容纳最多 1 个元素。
或者,简而言之,NSMutableArray
不是稀疏数组。没有孔。
如果预期没有匹配项,则在访问对象之前测试 array.length > 0
。
如果没有意外匹配,则调试您的代码。即使是基于 NSLog()
的调试也能在这里正常工作。
关于ios - 在 Objective-C 中填充 NSMutableArray 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25195627/