2016-05-08 6 views
1

私は完全な初心者なので、正しい質問をしているかどうかは分かりません。 forループ作品メンバ初期化子はどのようにStructsで動作しますか? (スウィフトで)

CASE1 
struct User 
{ 
    let name: String 
    let company: String 
    let login: String 
    let password: String 



static let database: Dictionary<String, User> = { 
    var theDatabase = Dictionary<String, User>() 
    for user in [ 
     User(name: "John Appleseed", company: "Apple", login: "japple", password: "foo"), 
     User(name: "Madison Bumgarner", company: "World Champion San Francisco Giants", login: "madbum", password: "foo"), 
     User(name: "John Hennessy", company: "Stanford", login: "hennessy", password: "foo"), 
     User(name: "Bad Guy", company: "Criminals, Inc.", login: "baddie", password: "foo") 
    ] { 
     theDatabase[user.login] = user 
    } 
    return theDatabase 
}() 

}

が、このdoesnの中のコード "一部:しかし、私は問題を抱えていますなぜ" ユーザー(名" ジョン...)理解Hを理解するために「T

CASE2 
struct User 
    { 
let name: String 
let company: String 
let login: String 
let password: String 

    for user in User(name: "John Appleseed", company: "Apple", login: "japple", password: "foo"){ 
print(user) 

} 

}

ow CASE1 works私はこのコードのより単純なバージョン、すなわちCASE2を実行しました。両方のケースでまったく同じことが起こっていますが、[User(.. arguments ..)に関して] 2番目のケースでは、 "Declaration Expected"というエラーが表示されます。 Sir Paul(Stanford cs193p)は、これはかなり単純なデータベースだと言いましたが、私はこの問題を6時間以上解決しようとしています。

答えて

1

for-loopsはクロージャに含まれている必要があります。

ケース1の場合、クロージャを使用してdatabaseという静的プロパティを宣言しています。これは宣言です:

static let database: Dictionary<String, User> = { 
    // This is the body of the closure 
}() 

あなたはfor-loopをクロージャー本体に入れます。これは、閉ループが実行されるときにforループをいつ実行するかを迅速なコンパイラに指示します。

ケース2の場合、forループは構造体にあります。しかし、構造体はクロージャではありません。したがって、速いコンパイラはforループをいつ実行するかを知らない。

構造体に含めることができるのは、プロパティ宣言、関数宣言、構造体宣言などの宣言だけです。 for-loopは宣言ではないので、コンパイラは宣言を参照すると予想していると不満を持ちます。

databaseがプロパティ宣言であるため、ケース1のコードが機能します。


しかし、別の問題があります。

For-inループは、SequenceTypeプロトコルに準拠するオブジェクトだけをループします。このようなオブジェクトの例には、配列およびString.CharatcerViewが含まれます。

ケース1の場合、for-inループは、SequenceTypeに従う配列をループします。それらの[]を参照してください。それらは配列を表します!ケース2の場合、新しく作成されたUserの周りにはないので、Userであり、SequenceTypeに準拠していないため、for-inループでは使用できません。

このコードを使用し、あなたの問題の両方を解決するために:あなたが見ることができるように

struct User 
{ 
    let name: String 
    let company: String 
    let login: String 
    let password: String 



    static let database: Dictionary<String, User> = { 
     var theDatabase = Dictionary<String, User>() 
     for user in [ 
      User(name: "John Appleseed", company: "Apple", login: "japple", password: "foo")] { 
       theDatabase[user.login] = user 
     } 
     return theDatabase 
    }() 
} 

を、私はdatabaseの宣言と閉鎖を追加し、ユーザーの周り[]を追加しました。

+0

ありがとう。 – 209135

1

これはかなり簡単です。 for コレクションには、配列、辞書、または別のコレクションを反復する機能があります。ケース1の場合、ユーザー配列を作成します。

[ 
User(), User() 
] 

ただし、2の場合はそうしません。 構文:[ユーザー()、ユーザー()、ユーザー()アレイを作成します。

関連する問題