成员初始化器如何在 Structs 中工作? (在Swift)
How do member Initializers work in Structs ? (In Swift)
由于我是一个完全的初学者,我什至不知道我是否在问正确的问题。但我无法理解为什么“User(name: "John ...)" 部分代码 在 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。尽管在这两种情况下都发生了完全相同的事情,[ 关于 User(..arguments..) ] 在第二种情况下我得到了错误 "Declaration Expected"。
Sir Paul(Stanford cs193p) 说这是一个相当简单的数据库,但我已经花了 6 个多小时试图解决这个问题。
这很简单。
for in [collection] 使您能够迭代数组、字典或另一个集合。在情况 1 中,您创建了用户数组:
[
User(), User()
]
但在情况 2 中你没有。
此语法: [ User(),User(),User() ] 创建一个数组。
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-在循环中。
要解决您的两个问题,请使用此代码:
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
的声明和闭包,并在用户周围添加了[]
。
由于我是一个完全的初学者,我什至不知道我是否在问正确的问题。但我无法理解为什么“User(name: "John ...)" 部分代码 在 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。尽管在这两种情况下都发生了完全相同的事情,[ 关于 User(..arguments..) ] 在第二种情况下我得到了错误 "Declaration Expected"。 Sir Paul(Stanford cs193p) 说这是一个相当简单的数据库,但我已经花了 6 个多小时试图解决这个问题。
这很简单。 for in [collection] 使您能够迭代数组、字典或另一个集合。在情况 1 中,您创建了用户数组:
[
User(), User()
]
但在情况 2 中你没有。 此语法: [ User(),User(),User() ] 创建一个数组。
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-在循环中。
要解决您的两个问题,请使用此代码:
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
的声明和闭包,并在用户周围添加了[]
。