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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

13439閲覧

swift3:出直し。"fatal error: unexpectedly found nil while unwrapping an Optional value"が出ます。

harima

総合スコア17

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/05/04 05:29

編集2017/05/04 05:35

書籍を購入してリストを入力したのですが、エラーが発生して動作しません。
大変申し訳ありませんが、どこが悪いのかご教授願います。

swift3

1// 2// ViewController.swift 3// ICloudDemo 4// 5import UIKit 6 7class ViewController: UIViewController{ 8 9 // Documentに関する情報 10 struct USDocInfo { 11 static let NAME = "usdoc_test" 12 static let EXTENSION = "us" 13 static var LOCAL_DOCUMENTS_PATH:String? = nil 14 static var ICLOUD_CONTAINER_PATH:String? = nil 15 } 16 17 // アプリのサンドボックスのパスを格納する変数 18 var localDocumentsPath: String { 19 if let dir = USDocInfo.LOCAL_DOCUMENTS_PATH { 20 return dir 21 } else { 22 let dir = NSSearchPathForDirectoriesInDomains( 23 .documentDirectory, 24 .userDomainMask, 25 true)[0] + "/" 26 27 USDocInfo.LOCAL_DOCUMENTS_PATH = dir 28 return dir 29 } 30 } 31 32 var iCloudContainerPath: String? { 33 return USDocInfo.ICLOUD_CONTAINER_PATH 34 } 35 36 var document: USDocument! 37 var documentURL: URL { return document.fileURL } 38 var isFileExists = false 39 40 let query = NSMetadataQuery() 41 42 43 override func viewDidLoad() { 44 super.viewDidLoad() 45 // Do any additional setup after loading the view, typically from a nib. 46 47 query.searchScopes = [ 48 NSMetadataQueryUbiquitousDocumentsScope, 49 NSMetadataQueryAccessibleUbiquitousExternalDocumentsScope] 50 51 query.predicate = NSPredicate(format: "%K LIKE '*'", NSMetadataItemFSNameKey) 52 53 DispatchQueue.global(qos: .default).async(execute: { 54 if let url = FileManager.default.url(forUbiquityContainerIdentifier: nil) { 55 print("iCloudコンテナのURL:\(url)") 56 USDocInfo.ICLOUD_CONTAINER_PATH = url.path + "/Documents/" 57 self.iCloudContainerDidInitialize() 58 } 59 }) 60 } 61 62 63 override func viewWillAppear(_ animated: Bool) { 64 super.viewWillAppear(animated) 65 NotificationCenter.default.addObserver(self, selector: #selector(ViewController.iCloudDocumentDidChange(_:)), name: NSNotification.Name.UIDocumentStateChanged, object: self.document) 66 } 67 68 69 override func viewWillDisappear(_ animated: Bool) { 70 super.viewWillDisappear(animated) 71 NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDocumentStateChanged, object: self.document) 72 } 73 74 75 override func didReceiveMemoryWarning() { 76 super.didReceiveMemoryWarning() 77 // Dispose of any resources that can be recreated. 78 } 79 80 81 func iCloudContainerDidInitialize() { 82 let filePath = iCloudContainerPath! + USDocInfo.NAME + "." + USDocInfo.EXTENSION 83 let fileUrl = URL(fileURLWithPath: filePath) 84 createDocument(fileUrl) 85 } 86 87 88 func createDocument(_ fileUrl: URL?) { 89 90 let localFilePath = localDocumentsPath + USDocInfo.NAME + "." + USDocInfo.EXTENSION 91 let localFileUrl = URL(fileURLWithPath : localFilePath) 92 let doc = USDocument(fileURL : localFileUrl) 93 94 doc.place = "自宅" 95print("自宅") 96 doc.save(to: localFileUrl, for: .forCreating, completionHandler: { (success:Bool) in 97 // "fatal error: unexpectedly found nil while unwrapping an Optional value" 98print("pass") 99 if success { 100 print("Documentデータを保存しました。") 101 102 } else { 103 print("Documentデータを保存できませんでした。") 104 } 105 106 }) 107 108 } 109 110 111 func iCloudDocumentDidChange(_ notification: Notification) { 112 if self.document.documentState.contains(.inConflict){ 113 do{ 114 try NSFileVersion.removeOtherVersionsOfItem(at: self.document.fileURL) 115 } catch let error { 116 print("エラー内容:\(error)") 117 } 118 if let conflicts = NSFileVersion.unresolvedConflictVersionsOfItem(at: self.document.fileURL){ 119 for fileVersion in conflicts { 120 fileVersion.isResolved = true 121 } 122 } 123 } 124 } 125}

もう一つのファイルです。

swift3

1// 2// USDocument.swift 3// ICloudDemo 4// 5 6import UIKit 7 8class USDocument: UIDocument { 9 10 // Static定数の宣言 11 struct USFileWrapperKeys { 12 static let IMG = "USDocuemnt.img" 13 static let PLACE = "USDocument.place" 14 static let DATE = "USDocument.date" 15 static let DETAIL = "USDocument.detail" 16 } 17 18 // 記録したい内容を保持するメンバ変数を宣言します 19 var img:UIImage? 20 var place:String? 21 var date:Date? 22 var detail:String? 23 24 25 26 // 上記、Documentの内容をひとまとめにパッケージするNSFileWrapperもメンバ変数として宣言します 27 var fileWrapper:FileWrapper? 28 29 // MARK: - 書き込み用のメソッド 30 31 override func contents(forType typeName: String) throws -> Any { 32 33 if self.fileWrapper == nil { 34 // 空のDictonaryを渡している 35 self.fileWrapper = FileWrapper(directoryWithFileWrappers:[:]) 36 } 37 38 if let place = self.place 39 , let data = place.data(using: String.Encoding.utf8) 40 { 41 let fw = FileWrapper(regularFileWithContents:data) 42 fw.preferredFilename = USFileWrapperKeys.PLACE 43 self.fileWrapper?.addFileWrapper(fw) 44 } 45 46 if let img = self.img 47 , let data = UIImageJPEGRepresentation(img, 1.0) 48 { 49 let fw = FileWrapper(regularFileWithContents:data) 50 fw.preferredFilename = USFileWrapperKeys.IMG 51 self.fileWrapper?.addFileWrapper(fw) 52 } 53 54 if let date = self.date { 55 let data = NSKeyedArchiver.archivedData(withRootObject: date) 56 let fw = FileWrapper(regularFileWithContents:data) 57 fw.preferredFilename = USFileWrapperKeys.DATE 58 self.fileWrapper?.addFileWrapper(fw) 59 } 60 61 if let detail = self.detail 62 , let data = detail.data(using: String.Encoding.utf8) 63 { 64 let fw = FileWrapper(regularFileWithContents:data) 65 fw.preferredFilename = USFileWrapperKeys.DETAIL 66 self.fileWrapper?.addFileWrapper(fw) 67 } 68 69 return self.fileWrapper as Any 70 } 71 72}

iCloudの設定画面です

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

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

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

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

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

TakeoAsai

2017/05/04 05:35

具体的にどのようなエラーが出ているのでしょうか?
harima

2017/05/04 05:37

96行目で"fatal error: unexpectedly found nil while unwrapping an Optional value"エラーが発生します。
fuzzball

2017/05/08 05:29

「96行目」で回答する人が分かると思いますか?
guest

回答1

0

ベストアンサー

localFileUrlnilであったりしませんか?
URL(fileURLWithPath : なんとかかんとか)が何を返しているか調べてみてください。

追記1
後から値を変更しないのなら、letvarに大差はないはずです。
varは後から変更する変数という意味です。letは変更しない変数という意味です。

それより、doc.save の行で症状が出ているのは、doclocalFileURLnil である状態で渡っていることが原因です。
原因をたどっていくために、localFileUrlを初期化しているあたりを、以下のように修正してデバッグしてみてください。
もし nil になっているとすれば、localFilePath などの変数に入っている値は、想定したとおりか確認してみてください。

Swift

1let localFileUrl = URL(fileURLWithPath : localFilePath) 2if localFileUrl == nil { 3 print("Error!", "localFileUrl was nil.", "localFilePath:", localFilePath) 4} 5let doc = USDocument(fileURL : localFileUrl)! 6if doc == nil { 7 print("Error!", "doc was nil.", "localFileUrl:", localFileUrl) 8}

追記2
func createDocument(_ fileUrl: URL?) {
この関数ではfileUrlを引数として受け取っていますが、関数の中では使っていないようですね。
この矛盾がバグを引き起こしているかもしれません。

もし、この引数の値を使わないなら、この引数を受け取らないような関数を修正してください。

もし、この引数の値を使うなら、URL?型はOptionalなので、この時点でnilが入っている可能性があります。
nilが入ることを防ぐため、(_ fileUrl: URL)のようにOptionalでない型に修正してください。

投稿2017/05/04 09:01

編集2017/05/05 08:42
acevif

総合スコア59

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

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

harima

2017/05/05 02:13

おっしゃる通りで let localfileUrl = で値が代入され、次の行で値が消えてました。また、let doc = も同様でした。 let の代わりに var にして見たのですが、値は保持されていましたが、 doc.save を実行すると同じエラーが発生しました。 何か他に試してみることはないでしょうか?宜しくお願い致します。
acevif

2017/05/09 09:09

ベストアンサーありがとうございます。 多忙のためこまめにお返事できなくてご免なさい。 解決しましたでしょうか。 がんばってくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問