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

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

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

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

Q&A

解決済

3回答

2152閲覧

[Swift] if let の逆パターン

noramimiyuma

総合スコア25

Swift

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

0グッド

0クリップ

投稿2017/02/24 02:00

■やりたいこと:
ある DictionaryString:[String] に対して、引数で渡ってきた文字列をKeyにもつvalue: [String]がなければ(= nilであれば)要素を追加する。

■詰まっていること:
上記のように「Optionalがnilの場合に処理を行う」ということをやりたいが、if let(もしくはif var)を使うと「nilでないときに処理を行う」ということになってしまうため、その逆を実現できない状況です。
何か方法はありますでしょうか。

※以下はイメージのためのコードです。

Swift

1 func addIdentifiers(identifier: String, coordinatesCount: String) { 2 3 if var coordinates = identifiers[identifier] { 4 5 } else { 6 // こっちで処理したいが、coordinatesを使いたい。これだと使えない 7 // coordinates.append(coordinatesCount) 8 // identifiers.updateValue(coordinates, forKey: identifier) 9 } 10 11 }

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

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

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

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

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

guest

回答3

0

以下の方法がシンプルですかね。

swift

1func addIdentifiers(identifier: String, coordinatesCount: String) { 2 3 identifiers[identifier] = identifiers[identifier] ?? [coordinatesCount] 4}

投稿2017/02/24 02:28

編集2017/02/24 02:34
_Kentarou

総合スコア8490

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

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

fuzzball

2017/02/24 02:32

[coordinatesCount]
guest

0

swift

1if identifiers[identifier] == nil { 2 //処理 3}
Setを使う

swift

1var identifiers = [String:Set<String>]() 2 3func addIdentifiers(identifier: String, coordinatesCount: String) { 4 if var coordinates = identifiers[identifier] { 5 //keyあり 6 coordinates.insert(coordinatesCount) 7 } else { 8 //keyなし 9 identifiers[identifier] = [coordinatesCount] 10 } 11}

投稿2017/02/24 02:09

編集2017/02/24 05:37
fuzzball

総合スコア16731

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

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

noramimiyuma

2017/02/24 02:14 編集

回答いただきありがとうございます。 ですが、この方法ですと処理を行う際に identifiers[identifer]をアンラップしなければならず、当然そこでnilが出てくるのでその時点でクラッシュしてしまいます。 ``` if identifiers[identifier] == nil { identifiers[identifier]!.append(coordinatesCount) // clash identifiers.updateValue(identifiers[identifier]!, forKey: identifier) } ```
noramimiyuma

2017/02/24 02:17

いや、処理の内容を変えればできるかもしれません。もう少し考えてみます。 そもそもnilの値にappendしている時点で頭悪いことしてました。
ozwk

2017/02/24 02:19

identifiers[identifier] = [coordinatesCount]でいいんじゃないですかね
guest

0

自己解決

以下のようにして実現することができました。
回答いただいたみなさまのおかげで気づきが得られました。ありがとうございました!
「この書き方はおかしい」などあれば教えていただけると幸いです。

Swift

1 func addIdentifiers(identifier: String, coordinatesCount: String) { 2 3 if var coordinates = identifiers[identifier] { // keyが存在する 4 if coordinates.index(of: coordinatesCount) == nil { // valueは存在しない: valueの配列にcoordinatesCountを追加する 5 coordinates.append(coordinatesCount) 6 identifiers[identifier] = coordinates 7 } 8 // keyもvalueもすでに存在するときは何もしない 9 } else { 10 // keyすら存在しない: identiferを新たなkeyに、coordinatesCount最初の要素として配列にしたものを新たなvalueとして格納 11 identifiers[identifier] = [coordinatesCount] 12 } 13 }

投稿2017/02/24 04:36

編集2017/02/24 05:19
noramimiyuma

総合スコア25

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

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

fuzzball

2017/02/24 05:29

identifiers[identifier] = coordinates この書き戻しは不要ですね。
fuzzball

2017/02/24 05:34

あと、「重複しない」という点だけで言うと、Setを使うと良いです。重複チェックが不要になります。 私の回答に追記しておきます。
noramimiyuma

2017/02/24 08:04

identifiers[identifier] = coordinates の書き戻しの件、 当初は私も不要だと考えて書かなかったのですが、どうもうまくいかず。 これを書いたらidentifiersに値が格納されていったので、やっぱり必要なのかと書き足しました...
noramimiyuma

2017/02/24 08:10

なるほど... インデックスがなく重複を許可しないSetという概念があるんですね!ありがとうございます。勉強になりました。適切な場面で適切なものを使えるようにしたいです。
fuzzball

2017/02/24 08:14

書き戻しの件、どうも私の検証ミスのようです。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問