Swift 追加到数组给了我 EXC_BAD_INSTRUCTION EXC_l386_INVOP 在 32 位系统上
Posted
技术标签:
【中文标题】Swift 追加到数组给了我 EXC_BAD_INSTRUCTION EXC_l386_INVOP 在 32 位系统上【英文标题】:Swift append to array gives me EXC_BAD_INSTRUCTION EXC_l386_INVOP on 32-bit systems 【发布时间】:2014-11-26 00:04:33 【问题描述】:所以我试图解析一个字符串并用每个转换为字符串的字符填充一个数组,并且我还删除了空格。
这是部分代码:
class KeyboardView: UIView
var answer: AnyObject?
var keyboardLetters = [String]()
override func willMoveToSuperview(newSuperview: UIView?)
for letter in answer! as String
if letter != " "
keyboardLetters.append(String(letter).lowercaseString)
当我去掉for循环后,错误就消失了,而且只发生在iPhone 4s和iPhone 5上,5s及以上都可以。
知道如何解决此问题或获取有关该错误的更多信息吗?
谢谢。
编辑
哦,我在 Xcode 6.1、Xcode 6.1.1 和 Xcode 6.2 beta 中对此进行了测试。到处都一样。
EDIT2
这是代码的较大部分,我只是注意到,如果我删除以 userAnswer 开头的行之后的所有内容,错误就会消失。
for letter in answer! as String
if letter != " "
keyboardLetters.append(String(letter).lowercaseString)
userAnswer = [Int](count: keyboardLetters.count, repeatedValue: -1)
while keyboardLetters.count < 21
let randomNumber = Int(arc4random()) % 25
let randomLetter = String(alphabet[randomNumber])
keyboardLetters.append(randomLetter)
keyboardLetters = shuffle(keyboardLetters)
请原谅我的 Swift,这是我的第一个应用程序。
【问题讨论】:
如果您将in answer! as String
更改为:in answer as? String
...会发生什么? answer
设置为什么?
如果我这样做,我会得到一个编译器错误:String? does not have a member named Generator
答案值为Tetris
刚刚尝试回答String
而不是AnyObject
,没有运气。
您能否实际发布一些您正在使用它的代码以及确切的错误消息?您要求进行大量的猜测,而我刚喝完茶叶。
【参考方案1】:
您的问题几乎可以肯定是arc4random()
电话。它返回一个无符号的 32 位整数。在 32 位平台上,Swift 的 Int
是 32 位签名的,所以大约一半的时间,你的 randomNumber
最终会是负数。负数不构成好的数组索引。
无论如何,您都应该使用arc4random_uniform()
,因为这样可以避免您自己取模时产生的偏差。作为奖励,这也应该解决负数问题:
let randomNumber = Int(arc4random_uniform(25))
【讨论】:
@Skoua 是的;错误指令异常通常表明断言在 Apple 库中失败。断言失败代码故意向 CPU 抛出错误指令以确保程序停止。以上是关于Swift 追加到数组给了我 EXC_BAD_INSTRUCTION EXC_l386_INVOP 在 32 位系统上的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionview 将数据追加到数组 Swift
Swift 获取 tableview 数组计数并将其放置 textview