1

私は完全な初心者なので、正しい質問をしているかどうかさえわかりません。しかし、 for ループのコードの " User(name: "John ...) " 部分が機能する理由を理解するのに苦労しています

    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
}()

}

しかし、これはそうではありません

 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)

}

}

CASE1 がどのように機能するかを理解するために、このコードの単純なバージョン、つまり CASE2 を実行しました。どちらの場合もまったく同じことが起こっていますが、[ User(..arguments..) について] 2番目のケースでは「Declaration Expected」というエラーが発生します。ポール卿 (スタンフォード cs193p) は、これはかなり単純なデータベースだと言いましたが、私はこの問題を 6 時間以上解明しようと試みてきました。

4

2 に答える 2

1

これは非常に簡単です。[ collection ]のfor を使用すると、配列、辞書、または別のコレクションを反復処理できます。ケース 1 では、ユーザーの配列を作成します。

[
User(), User()
]

しかし、ケース2ではそうではありません。この構文: [ User(),User(),User() ]配列を作成します。

于 2016-05-08T09:11:54.240 に答える
1

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

databaseケース 1 では、クロージャを使用して呼び出される静的プロパティを宣言しています。これは宣言です:

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

そして、 for ループをクロージャー本体に入れます。これは、for ループを実行するタイミング、つまりクロージャーが実行されるタイミングを迅速なコンパイラに伝えます。

ケース 2 では、for ループは構造体にあります。しかし、構造体はクロージャーではありません。そのため、swift コンパイラは for ループを実行するタイミングを知りません。

構造体に含めることができるのは、プロパティ宣言、関数宣言、構造体宣言などの宣言だけです。for ループは宣言ではないため、コンパイラは宣言を期待していると不平を言います。

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


しかし... 別の問題があります !

SequenceTypefor-in ループは、プロトコルに準拠するオブジェクトのみをループします。このようなオブジェクトの例には、配列や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とクロージャーの宣言を追加[]し、ユーザーの周りに追加しました。

于 2016-05-08T09:34:19.253 に答える