我在 Playground 上有一个带有 Swift 2.1.1 的 EXC_BAD_INSTRUCTION,需要帮助来识别它

Posted

技术标签:

【中文标题】我在 Playground 上有一个带有 Swift 2.1.1 的 EXC_BAD_INSTRUCTION,需要帮助来识别它【英文标题】:I have a EXC_BAD_INSTRUCTION with Swift 2.1.1 on Playground and need help to identify it 【发布时间】:2016-01-11 19:00:08 【问题描述】:

这是我的游乐场代码:

import UIKit

class CellularAutomata

    var array = Array(count:1, repeatedValue:Array(count: 1, repeatedValue: Bool()))
    var chanceToStartAlive = 0.45
    var width = 384
    var height = 384

    init()
        self.array = Array(count:self.width, repeatedValue:Array(count: self.height, repeatedValue: Bool()))
        initialise()
    
    init(chanceToStartAlive chance: Double)
        chanceToStartAlive = chance
        self.array = Array(count:self.width, repeatedValue:Array(count: self.height, repeatedValue: Bool()))
        initialise()
    
    init(chanceToStartAlive chance: Double, width columns: Int, height rows: Int)
        chanceToStartAlive = chance
        self.array = Array(count:columns, repeatedValue:Array(count: rows , repeatedValue: Bool()))
        initialise()
    

    func initialise()
        for index in 0...array.count
            for jndex in 0...array[index].count
                if(randomCGDouble() < self.chanceToStartAlive)
                    array[index][jndex] = true
                
            
        
    

    func randomCGDouble() -> Double 
        return Double(arc4random()) /  Double(UInt32.max)
    

在调用 initialise() 函数时会出现错误指令。我觉得我忽略了一些非常明显的事情,当有人向我解释时,我会面无表情。

编辑:对不起大家!我发现我做了一些愚蠢的事情。我需要对数组执行 .count - 1 。就像我说的,面对手掌。一旦我发现您可以在操场上激活控制台并最终可以获得一些错误的输出反馈,我就明白了这一点。

【问题讨论】:

你能发布一些有用的错误信息吗? EXC_BAD_INSTRUCTION 表示出现问题。没有帮助。 你的阵列到底有多大? 查看我的编辑和 luk2302 的回答,了解为什么这是错误的。这是一个如此简单的错误...... 【参考方案1】:

您必须将您的 initialise 更改为

func initialise()
    print(array.count)
    for index in 0..<array.count
        for jndex in 0..<array[index].count
            if(randomCGDouble() < self.chanceToStartAlive)
                array[index][jndex] = true
            
        
    

注意两个循环中的0..&lt;array,而不是前面的0...array。这将防止索引超出范围。

请注意,该数组非常大 - 请尝试使用 widthheight12 对其进行测试。

【讨论】:

是的,这也可以,类似于我在编辑中所做的 请避免使用 C 风格的 for 循环,否则它们会从语言中移除。如您所见,它们容易出错。 @tmpz :据此:github.com/apple/swift-evolution/blob/master/proposals/… 将保留 For-in 循环。正在删除看起来像这样的东西: for var i = 0 ;我 糟糕,我被误导了。

以上是关于我在 Playground 上有一个带有 Swift 2.1.1 的 EXC_BAD_INSTRUCTION,需要帮助来识别它的主要内容,如果未能解决你的问题,请参考以下文章

给我看一个带有 Upsurge Playground 的 Xcode 7.2.1 工作区的工作示例?

带有 Cocoapods 的 Xcode Playground

带有调试器支持的 Swift Playground?

在 Spring Boot 应用程序的生产环境中禁用 GraphiQL Playground

无法让我在 Swift 中的计时器在 Playground 中触发

当我在 Xcode 6 beta 中尝试 Swift Playground 时出错