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

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

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

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

Swift

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

Q&A

解決済

1回答

1619閲覧

appendを使って配列にアイテムを入れても中身がnilになってしまう

kjfnfljnf

総合スコア23

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/04/18 03:40

Swift: Version 5.1.3
XCode: Version 11.3.1

こんにちは。
appendを使って配列にアイテムを入れても中身がnilになってしまいます。
構造体の定義の仕方に問題があるのかと思って調べていたのですが,答えにたどり着かないので質問させていただきます。

posItemという構造体があり,中身はこのようになっています。

struct posItem { var itemId:String? var itemName:String? var itemImageUrl:String? var videoLink:String? var description:String? var optionGroups: [DrinkOptionGroup]? init? (id: String, name:String, imageUrl: String, videoLink: String, description: String, options: [DrinkOptionGroup]?) { self.itemId = id self.itemName = name self.itemImageUrl = imageUrl self.videoLink = videoLink self.description = description self.optionGroups = options } }

この構造体のインスタンスを作成し,それを戻り値としてリターンする関数を書いたのですが,その関数内で本件の質問内容である問題が起きています。

func convertItem(item: Item) -> posItem { let itemId = item.itemId let itemName = item.itemName let itemImageUrl = item.itemImageUrl let videoLink = item.videoLink let description = item.description var optionGroup:[DrinkOptionGroup]? let options = item.optionGroups if options != nil { for opt in options! { let option = getGroup(nameString: opt) if option != nil { optionGroup?.append(option!) } } } return posItem(id: itemId!, name: itemName!, imageUrl: itemImageUrl!, videoLink: videoLink!, description: description!, options: optionGroup)! }

optionをappendする際に,optionがnilでないことは確認できています。
しかしなが,posItemをリターンしようとした際に, appendしたはずなのにoptionGroupがnilになっています。

どこを直せば,正常に動きますでしょうか。
ご教授お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ぱっと見、初期化してない配列に要素を突っ込んでるように見えるのですが

swift

1class Item { 2 var name: String? 3 4 init(name: String) { 5 self.name = name 6 } 7} 8 9var items: [Item]? 10 11items?.append(Item(name: "A")) 12 13print(items) // => nil 14

↓いったん初期化すると入る

swift

1class Item { 2 var name: String? 3 4 init(name: String) { 5 self.name = name 6 } 7} 8 9var items: [Item]? 10 11items = [Item]() // 配列を初期化 12 13items?.append(Item(name: "A")) 14 15print(items?.first?.name) // => Optional("A") 16

投稿2020/04/18 03:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hoshi-takanori

2020/04/18 03:59

items?.append(...) ってことは items が nil なら何もしない、ってことですからね。
退会済みユーザー

退会済みユーザー

2020/04/18 04:02

あーそうか、何も考えずに書いてた... でコレが原因で答えあってます? > hoshi-takanoriさん
hoshi-takanori

2020/04/18 04:06

たぶん。ってか、Optional 使いすぎに見えます…。
kjfnfljnf

2020/04/18 04:13

お二方ともありがとうございます。 確かにOptional使いすぎですね。 var optionGroup = [DrinkOptionGroup]() と,配列を初期化することで少しはマシになりましたが,使い道しっかり考えていきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問