2016-11-16 111 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 
    } 
}) 
相關問題