2014-10-23 35 views
10

Sau khi tìm kiếm qua nhiều câu hỏi về sân chơi nhanh chóng nhiều ngay cả thủ công này, tôi vẫn đang vật lộn.Đọc tập tin nhanh chóng, sân chơi iOS

Tôi đã đặt một tệp văn bản trong thư mục Resources của nội dung gói và nó xuất hiện dưới dạng bí danh (liên kết) trong các tệp tạm thời đang chạy do sân chơi (/var/folders/ ...) tạo.

import UIKit 

let bundle = NSBundle.mainBundle() 

let myFilePath = bundle.pathForResource("dict1", ofType: "txt") 

println(myFilePath) // <-- this is correct, there is a shortcut to the Resource file at this location 

var error:NSError? 

var content = String(contentsOfFile:myFilePath!, encoding:NSUTF8StringEncoding, error: &error) 

println(content!) // <-- this is *NOT* the file contents [EDIT: see later note] 

// Demonstrate there's no error 
if let theError = error { 
    print("\(theError.localizedDescription)") 
} else { 
    print("No error") 
} 

Vấn đề là, rằng content được hiển thị ở đầu ra sân chơi như là Some "apple\ngame\nhow\nswift\ntoken", chứ không phải là nội dung tập tin như mong đợi.

Đó là tìm tệp, bởi vì nếu tôi thay đổi tên tệp, lỗi đó sẽ bị lỗi. Bạn có lời khuyên nào về nội dung tập tin không?

Xcode 6.1

EDIT: Vì vậy, thực tế vấn đề là tôi đã không hy vọng đầu ra sân chơi (bao gồm, println) để được thoát. Điều đó, kết hợp với sự mệt mỏi và những điều ngu ngốc khác đã khiến tôi tin rằng có một vấn đề, khi không tồn tại.

Điều thú vị là không phải mọi thứ dường như được thoát ở sân chơi:

println("foo\nbar") // Outputs "foo\nbar", escaped 
println("\\n")   // Outputs "\n", unescaped 
+1

Đó là mã làm việc ok cho tôi nếu tôi đặt một tập tin 'dict1.txt' vào vị trí thích hợp. Có gì trong tệp 'dict1.txt' của bạn và nó khác với những gì bạn thấy trong biến' content' của bạn? –

+1

@MikeS, thật tuyệt vời khi câu hỏi đơn giản của bạn dẫn tôi đến câu trả lời (hiển nhiên). Có, tất nhiên 'nội dung' khớp với tệp. Tôi không bao giờ nên mã hóa mệt mỏi. Điều đã ném tôi ra là '' \ n'' đã thoát, khiến nội dung trông giống như một con đường. – alttag

+0

Khi tôi đang học, đầu ra sân chơi của 'println'! = Đầu ra bàn điều khiển của' println'. Thông tin thêm trên bảng điều khiển [tại câu hỏi này] (http://stackoverflow.com/questions/24277848/how-to-reopen-console-output-in-a-swift-playground). – alttag

Trả lời

6

Tôi đã thấy vấn đề này với các file .txt được tạo ra từ file .rtf sử dụng TextEdit.

Tôi đã tải một tệp text.txt trong thư mục tài nguyên của sân chơi của tôi bằng cách sử dụng mã tương tự cho bạn. Nội dung tệp là "hello there" và được tạo bằng cách chuyển đổi tệp .rtf thành .txt bằng cách thay đổi phần mở rộng.

let path = NSBundle.mainBundle().pathForResource("text", ofType: "txt")//or rtf for an rtf file 
var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)! 
println(text) 

Kết quả là:

{\ rtf1 \ ansi \ ansicpg1252 \ cocoartf1343 \ cocoasubrtf140 {\ fonttbl \ f0 \ fswiss \ fcharset0 Helvetica;} {\ colortbl; \ red255 \ green255 \ blue255 ;} \ margl1440 \ margr1440 \ vieww10800 \ viewh8400 \ viewkind0 \ beo \ tx720 \ tx1440 \ tx2160 \ tx2880 \ tx3600 \ tx4320 \ tx5040 \ tx5760 \ tx6480 \ tx7200 \ tx7920 \ tx8640 \ pardirnatural

\ f0 \ fs24 \ cf0 hello there}

Vì vậy, "hello there" được nhúng. Đây là vấn đề với tất cả thông tin bố cục trong tệp .rtf.

Tôi quay lại TextEdit và tạo tệp .txt đúng. Sau khi mở một tệp - Định dạng | Tạo Văn bản thuần túy

Bây giờ mã này đã cho đầu ra giao diện điều khiển "hello there".

Hy vọng điều này sẽ hữu ích.

+0

Thông tin hữu ích, nhưng rõ ràng câu hỏi này không bị vấn đề RTF. Và ngu ngốc như tôi cảm thấy về những sai lầm tôi đã thực hiện, tôi chắc chắn tôi sẽ không làm điều này! – alttag

+0

Được rồi, mừng vì bạn đã giải quyết được vấn đề của mình! –

10

Bạn có thể thử tạo một lớp mở và lưu các tập tin của bạn:

update: Xcode 7.2 • Swift 2.1.1

class File { 
    class func open(path: String, encoding: NSStringEncoding = NSUTF8StringEncoding) -> String? { 
     if NSFileManager().fileExistsAtPath(path) { 
      do { 
       return try String(contentsOfFile: path, encoding: encoding) 
      } catch let error as NSError { 
       print(error.code) 
       return nil 
      } 
     } 
     return nil 
    } 
    class func save(path: String, _ content: String, encoding: NSStringEncoding = NSUTF8StringEncoding) -> Bool { 
     do { 
      try content.writeToFile(path, atomically: true, encoding: encoding) 
      return true 
     } catch let error as NSError { 
      print(error.code) 
      return false 
     } 
    } 
} 

sử dụng: File.tiết kiệm

let stringToSave:String = "Your text" 

let didSave = File.save("\(NSHomeDirectory())/Desktop/file.txt", stringToSave) 

if didSave { println("file saved") } else { println("error saving file") } 

sử dụng: File.open

if let loadedData = File.open("\(NSHomeDirectory())/Desktop/file.txt") { 
    println(loadedData) 
} else { 
    println("error reading file") 
} 

Nếu bạn thích làm việc với URL (như tôi làm và khuyến cáo của Apple):

class Url { 
    class func open(url: NSURL) -> String? { 
     do { 
      return try String(contentsOfURL: url, encoding: NSUTF8StringEncoding) 
     } catch let error as NSError { 
      print(error.code) 
      return nil 
     } 
    } 
    class func save(urL: NSURL, fileContent: String) -> Bool { 

     do { 
      try fileContent.writeToURL(urL, atomically: true, encoding: NSUTF8StringEncoding) 
      return true 
     } catch let error as NSError { 
      print(error.code) 
      return false 
     } 
    } 
} 
Các vấn đề liên quan