【问题标题】:swift 3 conversion causing (lldb) error `EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode)=0x0`swift 3 转换导致 (lldb) 错误`EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode)=0x0`
【发布时间】:2016-11-16 06:52:50
【问题描述】:

在将我的代码转换为 swift 3 后,我遇到了一个错误:

noteObjects.sort (comparator: { (first : AnyObject, second : AnyObject) -> ComparisonResult in

            if  let f : String = (first as! RChannels).name!   {
            let s : String = (second as! RChannels).name!

                return f.compare(s)
            }

        } as! (Any, Any) -> ComparisonResult)  // error here

as! (Any, Any) -> ComparisonResult) 这一行给了我一个错误,上面写着 (lldb),没有任何其他描述,任何人都可以解释这里出了什么问题?在转换之前是这样的:

noteObjects.sortUsingComparator { (first : AnyObject, second : AnyObject) -> NSComparisonResult in
        if  let f : String = (first as! RChannels).name!   {
            let s : String = (second as! RChannels).name!
            return f.compare(s)
        }
     }

noteObjects 是一个 NSMutableArray

【问题讨论】:

  • 为什么要用那个笨重的比较器和NSMutableArray?原生 Swift 数组类型和排序函数效率更高。

标签: ios swift3 comparator lldb xcode8.1


【解决方案1】:

去掉as! (Any, Any) -> ComparisonResult,把两个参数改成Any而不是AnyObject

noteObjects.sort(comparator: { (first : Any, second : Any) -> ComparisonResult in
    if let f : String = (first as! RChannels).name! {
        let s : String = (second as! RChannels).name!

        return f.compare(s)
    }
})

但这仍然存在一些问题。对于每个代码路径,您都没有 return 值,并且您没有正确处理选项。以下会更好:

noteObjects.sort(comparator: { (first : Any, second : Any) -> ComparisonResult in
    if let f = (first as! RChannels).name, let s = (second as! RChannels).name {
        return f.compare(s)
    } else {
        return .orderedSame
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多