2017-05-22 51 views
1

所以發生什麼事是當程序試圖訪問我炸燬的txt文件的其他2行時,當我查看數組下的xcode時,它顯示行被分隔「\ t」,但它不會顯示其他2行,以及它的瘋狂......請看我的代碼下面的任何幫助表示讚賞。致命錯誤:索引超出範圍Swift 3.1

var dictDoc = [String:String]() 
var docArray = NSMutableArray() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let path = Bundle.main.path(forResource: "docs", ofType: "txt") 
    let fileMgr = FileManager.default 
    if fileMgr.fileExists(atPath: path!){ 
     do{ 
      let fullText = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) 
      let readings = fullText.components(separatedBy: "\n") as [String] 
      for i in 1..<readings.count { 
       let docData = readings[i].components(separatedBy: "\t") 
       dictDoc["Program"] = "\(docData[0])" 
       dictDoc["Signature"] = "\(docData[1])" 
       dictDoc["Extension"] = "\(docData[2])" 
       docArray.add(dictDoc) 
      } 
     }catch let error as NSError{ 
      print("Error: \(error)") 
     } 
     self.title = "Word Processor Programs" 
    } 
    tableView.dataSource = self 
    tableView.delegate = self 
} 

func numberOfSections(in tableView: UITableView) -> Int {  
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return docArray.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    let doc = docArray[indexPath.row] 
    cell.textLabel?.text = "\((doc as AnyObject).object(forKey: "Program")!)" 
    cell.detailTextLabel?.text = "\((doc as AnyObject).object(forKey: "Signature")!) \((doc as AnyObject).object(forKey: "Extension")!)" 
    return cell 
} 

@IBAction func Closebtn(_ sender: UIButton) { 
} 
+0

你可以發佈你正在試圖打破成組件的文本? – ebby94

+0

方案\t Signautre \t擴展 字2.0 \t DB A5 2D 00 \t DOC MS酒吧子報頭\t FD 37 7A 58 5A 00 \t PUB Acrobat插件在\t 4D 5A 90 00 03 00 00 00 \t API MS酒吧 BDR WP DIC \t 43 42 46 49 4C 45 \t CBD 同桌文件\t 0D 44 4F 43 \t DOC 完美的辦公文檔\t CF 11 E0 A1 B1 1A E1 00 \t DOC 字d OC子頭\t EC A5 C1 00 \t DOC MS關閉文檔\t D0 CF 11 E0 A1 B1 1A E1 \t DOC | DOT | PPS | PPT –

+0

它失去了格式化,但多數民衆贊成在樣品 –

回答

0

除了Xcode中抱怨無法打印的ASCII字符複製文本的時候,有你的邏輯難以察覺的錯誤:注意最後的換行符。這意味着fullText.components(separatedBy: "\n")給你幾乎你想要什麼,但有一個額外的空字符串作爲結果數組的最後一個元素。

可能的解決方案:

  • 應用trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)fullText劈裂之前擺脫討厭的換行符。
  • 過濾該空字符串:let readings = fullText.components(separatedBy: "\n").filter { !$0.isEmpty }

哦,在我看來,API和MS Pub之間的\\應該是一個換行符:...API\n MS Pub...

更新

爲了幫助您跟蹤在未來的這些錯誤和防止程序與fatal error: Index out of range,轟然 你可能例如添加guard

... 
let docData = readings[i].components(separatedBy: "\t") 
guard docData.count == 3 else { 
    // Ignore, log message, throw error, whatever is appropriate in your use case. 
    print("Unexpected format in \(readings[i])") 
    continue 
} 
... 

不處理換行符在某種程度上,這打印

 
Unexpected format in '' 

我提到的\\也顯示:

 
Unexpected format in ' Acrobat plug-in 4D 5A 90 00 03 00 00 00 API\ MS Pub 58 54 BDR' 
+0

對不起,遲到的回覆,DUDE你是一個生活節省!!!!我不知道爲什麼回車被添加,我的意思是我已經嘗試了一切以擺脫那個,然後我看到這個和魔術發生了! –

+0

不客氣。作爲一般說明,當解析數據時,您不知道確切的格式,廣泛的檢查總是一個好主意。即使你知道:每個人都會犯錯誤:)。我用一個例子更新了我的答案。 – thm

相關問題