🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

Swift

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

Q&A

解決済

2回答

1730閲覧

Swiftにおける複数enum型を用いたstruct型による配列のswitchによるチェック方法

masayoshi555

総合スコア9

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

Swift

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

0グッド

0クリップ

投稿2019/10/30 03:23

編集2019/10/30 04:30

Playground(Apple提供のswift教材)を使用してswiftを学習しています。
Playground教材「19_列挙型とswitch文」における演習問題ニワトリを数えるでつまづいています。
if文であればできるのですが、switchを学習した意味がないので、switchで配列検索したいのですが、種々のエラーに阻まれ解決できませんでした。teratail内及びネット検索した内容では解決しなかったため質問させて頂きます。

1. 質問内容
- 回答はどのようになるか?(Playgroundには回答がありません)
- struct型内のenum型を用いた配列の基本的な呼び出し方

2. 問題(原文まま)
演習問題:ニワトリを数える

このPlaygroundにはChicken型が組み込まれています。Chickenにはbreed(品種)とtemper(性質)のプロパティがあり、どちらもenumです。

ここに、ニワトリの配列があります。

swift

1chickens

ニワトリは卵からかえったばかりなので、安全に数えることができます。

swift

1var chickenOfInterestCount = 0 2for chicken in chickens { 3 chickenOfInterestCount += 1 4} 5chickenOfInterestCount

演習
for…inループの中のコードをアップデートし、.hilarious .leghorn(陽気なレグホン種)のように関心のあるニワトリだけを数えてください。オートコンプリートのポップアップで、各enumが取りうる値を確認してください。

配列

swift

1public enum Breed { 2 case leghorn, rhodeIsland, silkie, plymouthRock 3} 4 5public enum Temper { 6 case friendly, grumpy, hilarious 7} 8 9public struct Chicken { 10 public let breed: Breed 11 public let temper: Temper 12} 13 14public let chickens: [Chicken] = [ 15 Chicken(breed: .leghorn, temper: .friendly), 16 Chicken(breed: .leghorn, temper: .friendly), 17 Chicken(breed: .leghorn, temper: .grumpy), 18 Chicken(breed: .rhodeIsland, temper: .friendly), 19 Chicken(breed: .leghorn, temper: .hilarious), 20 Chicken(breed: .rhodeIsland, temper: .friendly), 21 Chicken(breed: .rhodeIsland, temper: .grumpy), 22 Chicken(breed: .silkie, temper: .friendly), 23 Chicken(breed: .rhodeIsland, temper: .grumpy), 24 Chicken(breed: .silkie, temper: .grumpy), 25 Chicken(breed: .rhodeIsland, temper: .hilarious), 26 Chicken(breed: .leghorn, temper: .friendly), 27 Chicken(breed: .silkie, temper: .friendly), 28 Chicken(breed: .leghorn, temper: .hilarious), 29 Chicken(breed: .plymouthRock, temper: .grumpy), 30 Chicken(breed: .leghorn, temper: .grumpy), 31 Chicken(breed: .silkie, temper: .grumpy), 32 Chicken(breed: .plymouthRock, temper: .friendly), 33 Chicken(breed: .leghorn, temper: .friendly), 34 Chicken(breed: .leghorn, temper: .friendly), 35]

3.自身の回答とエラー
以下のように書きましたが、エラーとなってしまいました。
そのほかにもあれこれ迷走しましたが、設問にforループ内を修正すると記載があるのでシンプルにこの程度でできるはずと想像しております。

swift

1var chickenOfInterestCount = 0 2 3for _ in chickens { 4 switch chickens { 5 case (.leghorn, .hilarious): 6 chickenOfInterestCount += 1 7 default: 8 break 9 } 10} 11chickenOfInterestCount

error

1Tuple pattern cannot match values of the non-tuple type '[Chicken]'

↑このエラー自体は言っていることはわかるのですが、どうやったら解決するのかがわかりませんでした。

よろしくお願いします。


以下、その他試したことを追記

swift

1var chickenOfInterestCount = 0 2 3for chicken in chickens { 4 switch chicken { 5 case (Breed.leghorn, Temper.hilarious) : 6 chickenOfInterestCount += 1 7 default: 8 break 9 } 10} 11chickenOfInterestCount

error

1Enum case 'hilarious' is not a member of type '<<error type>>' 2Enum case 'leghorn' is not a member of type '<<error type>>' 3Tuple pattern cannot match values of the non-tuple type 'Chicken'

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

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

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

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

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

guest

回答2

0

その問題をやっていないので、問題の意図するところはわかりませんが、

swift

1 var chickenOfInterestCount = 0 2 3 for chicken in chickens { 4 switch (chicken.breed, chicken.temper) { 5 case (.leghorn, .hilarious): 6 chickenOfInterestCount += 1 7 default: 8 break 9 } 10 } 11 chickenOfInterestCount

もしくは

swift

1 var chickenOfInterestCount = 0 2 3 for chicken in chickens { 4 if chicken.breed == .leghorn && chicken.temper == .hilarious { 5 chickenOfInterestCount += 1 6 } 7 } 8 chickenOfInterestCount

で良いのかなと思います。

投稿2019/10/30 04:42

takabosoft

総合スコア8356

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

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

masayoshi555

2019/10/30 04:46

ありがとうございます! ifでの別回答まで頂き感謝いたします。 タッチの差で同じ回答を先に頂いたTakeOneさんをベストアンサーとさせて頂きました。
takabosoft

2019/10/30 06:36

引き続きがんばってください????
masayoshi555

2019/11/07 23:27

おかげさまでその後全トレーニング終了し、現在API勉強中です
guest

0

ベストアンサー

Chickenのbreedプロパティとtemperプロパティの内容を取り出して
タプルで組み立てた値をswitchに指定すれば、

swift

1switch (chicken.breed, chicken.temper) {

その値をcaseで比較できると思います。

swift

1case (.leghorn, .hilarious):

投稿2019/10/30 04:39

編集2019/10/30 05:14
TakeOne

総合スコア6299

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

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

masayoshi555

2019/10/30 04:46

早速のご回答かつ。明瞭なご回答ありがとうございます! この方法にて解決致しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問