Swift拥有保证

时间:2015-10-03 08:37:17

标签: ios objective-c swift swift2

我刚刚在xcode组织者中发现了5个崩溃报告。当我打开它们时,我得到了这个堆栈跟踪(标记区域是我的应用程序的名称):

enter image description here

iOS8.4以及iOS9以及iPhone 5和iPhone 6设备上也会出现此错误。

我很难追踪,因为我无法在iPhone5(8.4)和iPhone6(9.0.1)上重现它。

1./2。在某处:

override func onButtonTableViewCellClick(button: BfPaperButton) {}

3

var button: BfPaperButton = BfPaperButton.newAutoLayoutView()

func onClick() {
    delegate?.onButtonTableViewCellClick(button) // 3
}

我使用swift 2,xcode 7和iOS9。帮我理解错误。红色图像的第一行是什么意思?为什么这个错误与Swift.String完全无关?

我找到了这个帖子:https://forums.developer.apple.com/thread/6078我在那里提取了这些信息:

  

我发现这种崩溃的一个案例是基于Obj-C的对象   调用基于Swift的委托方法,参数值为   没有,但Swift方法签名不是可选类型。在里面   我看到的情况,这是桥接委托方法签名中的错误 -   它实际上应该是可选的。它可能是某种东西   在你的情况下类似(Swift定义不允许   它应该是可选的,或者它可能是Obj-C代码中的错误   (当它不应该生成时为零。

我使用了一个名为BfPaperButton的obj-c lib,它创建了一个看起来像android材质设计的Button。也许错误与这个库有关?

日志:

enter image description here

查看图片:http://i.stack.imgur.com/5aQ8m.png

我有两个字符串扩展名。一个用于长度,一个用于子串:

extension String {

    var length: Int { return self.characters.count }

    subscript (i: Int) -> String {
        return String(Array(self.characters)[i])
    }

    subscript (r: Range<Int>) -> String {
        let start = startIndex.advancedBy(r.startIndex)
        let end = startIndex.advancedBy(r.endIndex)
        return substringWithRange(Range(start: start, end: end))
    }
}

第188行是:

NSUUID().UUIDString[0...4]

使用子字符串扩展名。也许错误在这里?

override func onButtonTableViewCellClick(button: UIButton) {

        if let title = button.titleLabel?.text {

            if title == "Send code" {

                tmpPhoneNumber = ""

                var tmp = phoneNumber

                if tmp.length > 1 {
                    if tmp[0] == "0" {
                        tmp = tmp[1...tmp.characters.count - 1]
                    }

                    tmpPhoneNumber = "0049" + tmp
                    phoneNumberWithCode = tmpPhoneNumber
                    sendAlert(tmp)
                } else {
                    PfToast.showError("Please enter your phone number.")
                }

            } else if title == "Finish" {
                if let cell: InputTableViewCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 2)) as? InputTableViewCell {
                    if isLicenceValid(cell.inputField.inputField.text!) {
                        createCustomer(cell.inputField.inputField.text!)
                    } else {
                        PfToast.showError("Please enter correct licence plate.")
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:9)

在我看来,你正在寻找错误的地方。当我查看日志时,我看到的是:

  1. 点击按钮
  2. onButtonTableViewCellClick
  3. Obj-C to Swift internals(您可以在What's Dead & Exploded in Swift's exception stack?中了解更多信息)
  4. String索引Int(请参阅String.subscript.getter (Swift.Int) -> String
  5. 我们可以确定崩溃发生在这里:

    return String(Array(self.characters)[i])
    

    我认为我们可以排除nil,因为这会导致早期崩溃。您很可能有字符索引超出范围问题。这意味着i为负数或高于length - 1(也许您正在索引空文本?)

    不幸的是,重要的代码位于onButtonTableViewCellClick,您还没有发布。