質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

412閲覧

URL型からString型に変換時のエラー

AppDvl

総合スコア58

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/05/12 14:37

前提・実現したいこと

 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/ツールのバージョンなど)

swift4 xcode10.2画面のコピー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/05/13 01:49

>>エラーの意味を調べると’try’や’doで囲っていない’時に出るエラーだとわかりました。 >>しかし下記の通り記述しています。 記述しているように見えないのですが。
guest

回答2

0

ベストアンサー

Call can throw, but it is not marked with 'try' and the error is not handled(直訳 : 呼び出しはスローすることができますが、 'try'とマークされておらず、エラーは処理されません。)

同じような質問がStackOverflowに投稿されていたのでリンク貼っておきます。

投稿2019/05/13 01:22

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AppDvl

2019/05/13 10:25

stdioさん ありがとうございます。 targetTextFilePathString = try! String(contentsOf: targetTextFilePath) とすることでエラーが消えました。 do~catch try をもう少し勉強しなおします。
guest

0

とりあえず下記の通りに修正しましたが、いまいちピンと来ないのでdo~catch try を勉強しなおします。

do {
try initialText.write(to: targetTextFilePath, atomically: true, encoding: String.Encoding.utf8)
targetTextFilePathString = try! String(contentsOf: targetTextFilePath)
} catch let error as NSError {
print("failed to write: (error)")
}

投稿2019/05/13 10:29

AppDvl

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問