2016-11-16 112 views
0

转换我的代码为SWIFT 3之后,我的一个错误:SWIFT 3换算,导致(LLDB)错误`EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子码)= 0x0`

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的

+1

为什么这个笨重的比较和'NSMutableArray'?本机Swift数组类型和排序功能效率更高。 – vadian

回答

0

摆脱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 
    } 
}) 
相关问题