48663


swift初心者です。 ゲームなどのチーム選択の表現方法について教えていただきたいです。  
自分の選択したチームにおいてそのUIImageを自分のチームとして設定できるようにしたいのですがどうすればよいでしょうか。的外れなコードかもしれませんが下のコードではエラーが起こってしまいます。教えていただけると嬉しいです。

[code]

    enum Team {
        case WhiteTeam
        case StripeTeam
    }
    
    enum WhiteTeam: String {
        case A = "whiteplayer_1"
        case B = "whiteplayer_7"
        case C = "whiteplayer_10"
        case D = "whiteplayer_11"
        case E = "whiteplayer_12"
        case F = "whiteplayer_13"
    
        static let values = [A, B, C, D, E, F]
    
    
    }
    
    enum StripeTeam: String {
        case A = "stripeplayer_1"
        case B = "stripeplayer_3"
        case C = "stripeplayer_4"
        case D = "stripeplayer_7"
        case E = "stripeplayer_10"
        case F = "stripeplayer_11"
    
        static let values = [A, B, C, D, E, F]
    }
    
    struct Allyteam {
        var myteam: Team
    
        for player in myteam.values {
            image = UIImage(named: player)
        }
    }
    
[/code]

swift4 xcode ver9.4.1です。  
この場合forの部分についてExpected declarationのエラーが発生します。


CC BY-SA 4.0
2018-09-23T16:58:11.247
48662
2018-09-23T18:21:48.360
2018-09-23T17:16:28.933
30215
30215
question
swift ios swift4
ゲームなどのチーム選択の表現方法について


**_swift4 xcode ver9.4.1です。_**

Xcode
9.4.1についてくるSwiftのバージョンは正確には4.1ですね。(さらに正確にいうとサブマイナー番号が付きますが、実際のコードには影響しないので、普通そこまでは書きません。)4.0と4.1を比べると、ちょっとだけ違いがあります。Swiftのバージョンを聞かれたら、Xcode
9.4.1ならSwift 4.1と答えられるようにして置いてください。(Xcode 9.4.1にはSwift
4.1しかついてこないんで、Xcodeのバージョンがわかれば十分なんですが。)

**_この場合forの部分についてExpected declarationのエラーが発生します。_**

Swiftでは、for-
in文のような実行文は、何かのメソッド(またはイニシャライザ)の中に書く必要があります。ここではイニシャライザにしておくと例えば、次のようになります。

(以下のコードは説明用でコンパイル時にエラーになります。)

[code]

    struct Allyteam {
        var myteam: Team
    
        init(team: Team) {
            self.myteam = team
            for player in myteam.values {
                image = UIImage(named: player)
            }
        }
    }
    
[/code]

ひとつエラーを解消したので、元のコードにあった別のエラーが顕在化してきました。  
`myteam.values`のところで、次のようなエラーになります。

>
[code]

>     Value of type 'Team' has no member 'values'
>  
[/code]

`Team`型の値には`values`なんてメンバー(メソッドかプロパティなんかのこと)は無いですよと言われてます。

実際あなたの`Team`型の宣言はこれだけ:

[code]

    enum Team {
        case WhiteTeam
        case StripeTeam
    }
    
[/code]

で、どこにも`values`なんて定義されていません。case名と同じ`WhiteTeam`型と`StripeTeam`型を定義したので、それらと結びつけてくれると思われたのでしょうが、case名と型名は全く別物なので、識別子が同じだからといって、自動的に関連づけることはできません。

その辺をはっきりさせるためにも、case名はSwiftの慣習に従って、小文字始まりの識別子にした方が良いでしょう。

[code]

    enum Team {
        case whiteTeam
        case stripeTeam
    }
    
[/code]

`Team`型の各caseと、`WhiteTeam`型や`StripeTeam`型との関連づけは、メソッドかプロパティの形で自分で書いてやらないといけません。今はplayer名が文字列で得られれば良いようなので、計算型プロパティを追加するとこんな感じになります。

[code]

    extension Team {
        var players: [String] {
            switch self {
            case .whiteTeam:
                return WhiteTeam.values.map{$0.rawValue}
            case .stripeTeam:
                return StripeTeam.values.map{$0.rawValue}
            }
        }
    }
    
[/code]

(`WhiteTeam`型の`values`は`[WhiteTeam]`型、`StripeTeam`型の`values`は`[StripeTeam]`型なので、それぞれ`map`を使って`[String]`型に変換しています。)

この`players`を使って、さっきのイニシャライザを書き換えてやるとこうなります。

(以下のコードもまだコンパイル時にエラーになります。)

[code]

    struct Allyteam {
        var myteam: Team
    
        init(team: Team) {
            self.myteam = team
            for player in myteam.players {
                image = UIImage(named: player)
            }
        }
    }
    
[/code]

今度は、`image`のところで:

>
[code]

>     Use of unresolved identifier 'image'
>  
[/code]

Swiftでは全ての変数は宣言しないと使えません。しかも画像は`player`ごとに異なるはずなので、1つじゃ足りないですね。配列型のインスタンスプロパティにしてみましょう。

[code]

    struct Allyteam {
        var myteam: Team
        var playerImages: [UIImage]
    
        init(team: Team) {
            self.myteam = team
            playerImages = []
            for player in myteam.players {
                playerImages.append(UIImage(named: player)!)
            }
        }
    }
    
[/code]

これでコンパイル時のエラーは出なくなります。

(危険な強制アンラップ(`!`)を使ってます。画像リソースが存在しないとアプリがクラッシュするのでご注意を。)

* * *

ただ、この`Allyteam`型、プレーヤーの画像を配列で持っているのに、画像以外のプレーヤー情報を持っていない、というのは何か変な気がしますね。

ひとくちにゲームと言ってもいろいろあるので、確実なことは言えませんが、チーム内のプレーヤー構成を表すのにenumを使うというのはかなり考えにくいケースのように思います。

ただ、ご質問に書かれていない内容をあれこれ推測して書いたものを見ていただくより、ここまでの修正を試してご理解いただいてから、何か困ったことがあれば、また質問していただいた方が良いように思います。

このようなとりあえずの内容ですが、お試しください。


CC BY-SA 4.0
2018-09-23T18:16:30.727
48663
2018-09-23T18:21:48.360
2018-09-23T18:21:48.360
13972
13972
48662
answer