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

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

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

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

Swift

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

Q&A

2回答

1310閲覧

Swift3 Xcode8 SIGABRT

Tats.N

総合スコア62

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/12/16 01:59

こんにちは。いつもありがとうございます。
NSUserDefaultを触っていた時にSIGABRTが出ました。
多分ArrayとStringの扱いをどこかで間違っていると思うのですが、まだわからず困っています。どこが間違っているのでしょうか。。

それとSIGABRTが出た時にどこを見て解決できますか?
宜しくお願いします。

Could not cast value of type '__NSCFArray' (0x10b10ee88) to 'NSString' (0x10a716ad8). (lldb)
0x10a2cc4da <+1786>: leaq -0x168(%rbp), %rsi

Swift

1 2import UIKit 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 @IBOutlet var textInput: UITextField! 7 @IBOutlet var table: UITableView! 8 9 10 //var fridgeItem = [String]() // this is going to init this array so i don't need to put anything in it. 11 //var freezerItem = [String]() 12 //var otherItem = [String]() 13 var items = [[String](),[String](),[String]()] 14 //Fridge, Freezer, Other 15 16 //refered:http://cabbalog.blogspot.com/2016/09/xcode8-swift3-nsuserdefaults.html 17 let ud = [UserDefaults.standard,UserDefaults.standard,UserDefaults.standard] 18 19 @IBOutlet var fridgeSegOutlet: UISegmentedControl! 20 @IBAction func fridgeSeg(_ sender: Any) { 21 if UserDefaults.standard.object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) != nil{ 22 items[fridgeSegOutlet.selectedSegmentIndex] = UserDefaults.standard.object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) as! [String] 23 } 24 print(fridgeSegOutlet.selectedSegmentIndex) 25 26 table.reloadData() 27 } 28 29 @IBAction func addItem(_ sender: Any) { 30 // Add item to list 31 if textInput.text != "" { 32 items[fridgeSegOutlet.selectedSegmentIndex].append(textInput.text!) 33 } 34 // Clear text input field 35 textInput.text = "" 36 37 // refresh table view 38 table.reloadData() 39 40 // save into memory 41 ud[fridgeSegOutlet.selectedSegmentIndex].set(items, forKey: String(fridgeSegOutlet.selectedSegmentIndex)) 42 43 self.textInput.resignFirstResponder() 44 } 45 46 override func viewDidLoad() { 47 super.viewDidLoad() 48 if UserDefaults.standard.object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) != nil{ 49 items[fridgeSegOutlet.selectedSegmentIndex] = UserDefaults.standard.object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) as! [String] 50 } 51 52 for index in 0...2{ 53 ud[index].set(items[index], forKey: String(index)) 54 } 55 } 56 57 public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 58 59 return items[fridgeSegOutlet.selectedSegmentIndex].count 60 } 61 62 public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 63 64 let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell") 65 66 cell.textLabel?.text = items[fridgeSegOutlet.selectedSegmentIndex][indexPath.row] 67 68 return cell 69 70 } 71 72 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 73 if editingStyle == UITableViewCellEditingStyle.delete{ 74 items[fridgeSegOutlet.selectedSegmentIndex].remove(at: indexPath.row) 75 76 table.deleteRows(at: [indexPath], with: .automatic) 77 78 UserDefaults.standard.object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) 79 } 80 } 81 82 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 83 self.view.endEditing(true) 84 } 85 86 override func didReceiveMemoryWarning() { 87 super.didReceiveMemoryWarning() 88 // Dispose of any resources that can be recreated. 89 } 90 91 92}

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

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

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

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

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

guest

回答2

0

まずUserDefaultsを配列にする必要はありません。
UserdDefaultskeyごとにオブジェクトを保存するものなので、

let ud = UserDefaults.standard

で大丈夫です。
ud[index]とはせずに、udだけで大丈夫です。
その他の
UserDefaults.standardの部分もudに置き換えて大丈夫ですよ

今回だと

@IBAction func addItem(_ sender: Any) { // Add item to list if textInput.text != "" { items[fridgeSegOutlet.selectedSegmentIndex].append(textInput.text!) } // Clear text input field textInput.text = "" // refresh table view table.reloadData() // save into memory ud[fridgeSegOutlet.selectedSegmentIndex].set(items, forKey: String(fridgeSegOutlet.selectedSegmentIndex)) self.textInput.resignFirstResponder() }

ここの

ud[fridgeSegOutlet.selectedSegmentIndex].set(items, forKey: String(fridgeSegOutlet.selectedSegmentIndex))

の部分がおかしそうですね。itemsの方は[[String]]の二重配列ですので、String(fridgeSegOutlet.selectedSegmentIndex)というkeyで保存するものが、ここで[[String]]になってしまっています。他の箇所では、[String]を想定してコードを書いているように思います。ここでの保存の仕方は、

// let ud = UserDefaults.standard になっていると想定すると、 ud.set(items[fridgeSegOutlet.selectedSegmentIndex], forKey: String(fridgeSegOutlet.selectedSegmentIndex))

ではないでしょうか?
保存するものと取得するものが、同じ型になるように注意されるといいと思います。

ただ今回はエラー箇所をコードを読んで想像で書いていますので、どの行でエラーが出ているか、あるいは、どの処理をした時にエラーが出たかも合わせて書かれると、解答を得やすいと思います。

それとSIGABRTが出た時にどこを見て解決できますか?

これに対する解答としては、どの処理を行ったときに出たかを踏まえて、すでに記述されていますが、エラー内容を翻訳・理解して、対処し、翻訳・理解しても対処できないときは、エラー内容の変数名などの個別具体的な部分を取り除いた上で、Google検索されるとよいと思います。(言葉足らずすみません。わからなければ質問いただければ、もっと噛み砕いて説明します)

今回だと、castがキャストつまり、型変換なので、

NSArrayからNSStringに型変換できませんでした

といった感じでしょうか? ArrayとStringは関係性のないクラス同士ですので、変換できません。それによって生じたエラーですので、そもそも変換しないようにコードを書かないといけないことがわかります。

投稿2016/12/16 21:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

それとSIGABRTが出た時にどこを見て解決できますか?

  1. エラーメッセージの意味を理解(翻訳)する。
  2. 理解出来なければググる。
  3. 理解したら間違いを探して直す。

投稿2016/12/16 02:12

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問