2016-05-08 2 views
1

Поскольку я полный новичок, я даже не знаю, задаю ли я правильный вопрос или нет. Но у меня возникают проблемы понять, почему "пользователя (имя:„Джон ...)“часть кода в течение цикла работыКак инициализаторы членов работают в Structs? (В Swift)

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) 

} 

}

Чтобы понять час ow CASE1 работает Я использовал более простую версию этого кода, то есть CASE2. Несмотря на то, что то же самое происходит в обоих случаях, [Что касается пользователя (.. аргументы ..)] Я получаю сообщение об ошибке «Ожидаемая заявка» во втором случае. Сэр Пол (Stanford cs193p) сказал, что это довольно простая база данных, но я пытался понять эту проблему более 6 часов.

ответ

1

для петель должны содержаться в затворах.

В случае 1 вы объявляете статическое свойство, называемое database, используя закрытие. Это декларация:

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

И вы помещаете петлю в корпус крышки. Это говорит быстрому компилятору, когда нужно выполнить цикл for-loop, который выполняется при закрытии.

В случае 2, for-loop находится в структуре. Но структура не является закрытием. Поэтому быстрый компилятор не знает, когда нужно выполнить цикл for.

Единственными вещами, которые могут быть в структуре, являются объявления, такие как объявления свойств, объявления функций и объявления структур. Цикл for-loop не является объявлением, поэтому компилятор жалуется, что ожидается, что он увидит объявление.

Код в случае 1 работает, потому что database является декларацией собственности.


Но ... есть еще одна проблема!

Проводные петли только проходят через объекты, соответствующие протоколу 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

Got it. Благодарю. – 209135

1

Это довольно просто. для в [коллекция] дает вам возможность итерации по массиву, словарю или другой коллекции. В случае 1 вы создаете массив Пользователей:

[ 
User(), User() 
] 

но в случае 2 у вас нет. Этот синтаксис: [ Пользователь(), Пользователь(), Пользователь() ] создать массив.

Смежные вопросы