2015-10-05 3 views
1

У меня есть папка сайта в моем приложении. Я собираю HTML-строку и загружаю ее в webview. В процессе я сталкивался с ошибкой при попытке загрузить два файла.Прочитать локальный файл HTML в iOS Swift2

let hpath: String = "site/header.html" 
let fpath: String = "site/footer.html" 
let head: String = String(contentsOfFile: hPath, encoding: NSUTF8StringEncoding, error: nil) 
let foot: String = String(contentsOfFile: fPath, encoding: NSUTF8StringEncoding, error: nil) 
return head + foot 

Ошибка:

Cannot invoke initializer for type 'String' with an argument list of type '(contentsOfFile: String, encoding: UInt, error: NilLiteralConvertible)'

Мой источник такой же, как примеры, которые я нашел. Может быть, сейчас это изменилось в Swift 2. В любом случае, что нужно изменить, чтобы я мог прочитать содержимое этих двух файлов?

+0

Посмотрите на документы для 'init (contentOfFile путь: String, encoding enc: UInt) throws'. Вы также должны прочитать раздел языка Swift 2 на do/try/catch и что это означает для методов, которые используют «NSError» в Objective-C. –

ответ

1

Вот как я смог прочитать пару файлов из каталога, который я добавил в свой проект. Я передаю тело HTML методу, затем я обертываю его заголовком и нижним колонтитулом, хранящимся в файловой системе приложения.

func assembleHTML(var html: String) -> String { 
    let fileMgr = NSFileManager.defaultManager() 
    let hPath = NSBundle.mainBundle().pathForResource("site/header", ofType: "html")! 
    let fPath = NSBundle.mainBundle().pathForResource("site/footer", ofType: "html")! 
    var hContent: String? 
    var fContent: String? 
    if fileMgr.fileExistsAtPath(hPath) && fileMgr.fileExistsAtPath(fPath) { 
     do { 
      hContent = try String(contentsOfFile: hPath, encoding: NSUTF8StringEncoding) 
      fContent = try String(contentsOfFile: fPath, encoding: NSUTF8StringEncoding) 
     } catch let error as NSError { 
      print("error:\(error)") 
     } 
    } else { 
     print("not found") 
    } 
    html = hContent! + html + fContent! 
    return html; 
} 
2

Обработка ошибок в Swift 2 изменилась. Если необходимо обработать ошибку во время выполнения и нуждаются в сообщении об ошибке:

var head: String 
do { 
    head = try String(contentsOfFile: hPath, encoding: NSUTF8StringEncoding) 
} 
catch let error as NSError { fatalError(error.localizedDescription) // or do something else with the error} 

Если вы знаете, что файл будет существовать во время выполнения (например, в комплекте приложения):

let foot: String = try! String(contentsOfFile: fPath, encoding: NSUTF8StringEncoding) 

выше разобьет если файл не существует.

Третий вариант:

let foot: String? = try? String(contentsOfFile: fPath, encoding: NSUTF8StringEncoding) 

Это не будет вылетать, если файл не существует, но возвращает дополнительную строку и сообщение об ошибке.

Смежные вопросы