前提・実現したいこと
exportボタンを押すとドキュネントにdateText.txtがなければ新規作成し、存在すれば上書きする機能を持たせたい。
そこでドキュメントのパスを変数targetTextFilePathのurl型で取得しているので、
String(contentsOf: URL)でURLからStringに変換しようとすると
「Call can throw, but it is not marked with 'try' and the error is not handled」というエラーメッセージが出てしまします。
エラーの意味を調べると’try’や’doで囲っていない’時に出るエラーだとわかりました。しかし下記の通り記述しています。
見にくい記述ですが解決方法をお教えください。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Call can throw, but it is not marked with 'try' and the error is not handled
該当のソースコード
swift4
1// 2// detailsViewController.swift 3// testTimer 4// 5// Created by MBP13 on 2019/05/02. 6// Copyright © 2019 Tomoyuki Ashikari. All rights reserved. 7// 8 9import UIKit 10 11class detailsViewController: UIViewController,UITextFieldDelegate{ 12 13 var btText:String = "" 14 var ftText:String = "" 15 var ttText:String = "" 16 17 @IBAction func export(_ sender: Any) { 18 19 20 let textFileName = "dateText.txt" 21 let initialText = "最初に書き込むテキスト" 22 var targetTextFilePath : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] //とりあえず適当に初期値設定 23 var targetTextFilePathString : String 24 // DocumentディレクトリのfileURLを取得 25 if let documentDirectoryFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last { 26 // ディレクトリのパスにファイル名をつなげてファイルのフルパスを作る 27 let targetTextFilePath = documentDirectoryFileURL.appendingPathComponent(textFileName) 28 29 do { 30 try initialText.write(to: targetTextFilePath, atomically: true, encoding: String.Encoding.utf8) 31 32 } catch let error as NSError { 33 print("failed to write: (error)") 34 } 35 targetTextFilePathString = String(contentsOf: targetTextFilePath) 36 37 //print(type(of: targetTextFilePath))//型を調べる 38 39 print("上書きしました。書き込むファイルのパス: (targetTextFilePath)") 40 41 } 42 43 if( FileManager.default.fileExists( atPath: targetTextFilePath ) ) { 44 print("ファイルあり") 45 46 // テキストを追記するメソッド 47 func appendText(fileURL: URL, string: String) { 48 do { 49 let fileHandle = try FileHandle(forWritingTo: fileURL) 50 // 改行を入れる 51 let stringToWrite = "\n" + string 52 // ファイルの最後に追記 53 fileHandle.seekToEndOfFile() 54 fileHandle.write(stringToWrite.data(using: String.Encoding.utf8)!) 55 } catch let error as NSError { 56 print("failed to append: (error)") 57 } 58 } 59 //実行 60 appendText(fileURL: targetTextFilePath , string: "書き込みテスト") 61 62 63 64 } else { 65 print("ファイルなし") 66 67 68 func createAndWriteTextFile() { 69 // 作成するテキストファイルの名前 70 let textFileName = "dateText.txt" 71 let initialText = "最初に書き込むテキスト" 72 // DocumentディレクトリのfileURLを取得 73 if let documentDirectoryFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last { 74 // ディレクトリのパスにファイル名をつなげてファイルのフルパスを作る 75 let targetTextFilePath = documentDirectoryFileURL.appendingPathComponent(textFileName) 76 print("新規でファイルを作りました。書き込むファイルのパス: (targetTextFilePath)") 77// print(type(of: targetTextFilePath))//型を調べる 78 do { 79 try initialText.write(to: targetTextFilePath, atomically: true, encoding: String.Encoding.utf8) 80 } catch let error as NSError { 81 print("failed to write: (error)") 82 } 83 } 84 } 85 //実行 86 createAndWriteTextFile() 87 88 } 89 } 90 91 //@IBOutlet weak var dateText: UITextField!//textでは改行ができない 92 @IBOutlet weak var dateText: UITextView! 93 @IBAction func backButton(_ sender: Any) { 94 self.dismiss(animated: true, completion: nil)//viweを閉じる 95 } 96 @IBAction func clearButton(_ sender: Any) { 97//アラートのインスタンス化 98 let alert = UIAlertController(title: "clear", message: "Do you really want to clear?", preferredStyle: .alert) 99//OKが押されたとき 100 alert.addAction(UIAlertAction(title: "OK", style: .default, handler:{ 101 action in 102 startDates.removeAll() 103 userDefaults.set(startDates, forKey:"startDates")//永続化で保存(更新) 104 self.dateText.text = "" 105 } 106 )) 107//キャンセルが押されたとき 108 alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 109//アラートを表示する 110 present(alert, animated: true, completion: nil) 111 } 112 113 114 115 116 var no = 1 117 var non = 0 118 var counts :Int = 0 119 var cnt :Int = 0 120 121 override func viewDidLoad() { 122 super.viewDidLoad() 123 124 for _ in startDates { 125 // staetDatesにデータ入っていれば処理する 126 127 if startDates.count > 0{ 128 let dateformatter = DateFormatter() 129 dateformatter.dateFormat = "yy/MM/dd HH:mm:ss E" 130 let startTime = dateformatter.string(from: startDates[counts]) 131 btText = btText + String( non + 1 ) + "." + startTime + String(",\n") //順番大事dateText.text!に挿入されていくことに注意 132 counts += 1 133 non += 1 134 135 } 136 137 } 138 139 dateText.text! = btText 140 print("nilでbtTextは" + "(btText)") 141 142// dateText.textContainerInset = UIEdgeInsets.zero 143// dateText.textContainer.lineFragmentPadding = 0 144 145 //コピー可能だが編集不可。 146 dateText.isUserInteractionEnabled = true //キーボードを出したくない 147 dateText.isEditable = false //キーボードを出したくない 148} 149} 150
試したこと
targetTextFilePathを宣言する場所を変えてみたり、変数と定数を入れ替えてみたりしましたが、解決しませんでした。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー