1

由于我是一个完整的初学者,我什至不知道我问的问题是否正确。但我无法理解为什么for 循环中的“用户(名称:”约翰 ...) “部分代码有效

    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。即使在两种情况下都发生完全相同的事情,[关于用户(..arguments..)]我在第二种情况下收到错误“预期声明”。保罗爵士(斯坦福 cs193p)说这是一个相当简单的数据库,但我已经尝试解决这个问题超过 6 个小时。

4

2 回答 2

1

这很简单。for in [ collection ]使您能够迭代数组、字典或其他集合。如果您创建用户数组 1:

[
User(), User()
]

但在情况2你不。此语法:[ User(),User(),User() ]创建一个数组。

于 2016-05-08T09:11:54.240 回答
1

for 循环必须包含在闭包中。

在案例 1 中,您正在声明一个database使用闭包调用的静态属性。这是声明:

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

然后将 for 循环放入闭包体中。这告诉 swift 编译器何时执行 for 循环,也就是执行闭包的时间。

在情况 2 中,for 循环位于结构中。但是结构不是闭包。所以 swift 编译器不知道何时执行 for 循环。

可以在结构中的唯一内容是声明,例如属性声明、函数声明和结构声明。for 循环不是声明,这就是编译器抱怨它希望看到声明的原因。

案例 1 中的代码有效,因为它database是一个属性声明。


但是……还有一个问题!

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和闭包,并[]在用户周围添加。

于 2016-05-08T09:34:19.253 回答