【问题标题】:How do member Initializers work in Structs ? (In Swift)成员初始化器如何在 Structs 中工作? (在斯威夫特)
【发布时间】:2016-05-08 09:01:45
【问题描述】:

由于我是一个完整的初学者,我什至不知道我问的问题是否正确。但我无法理解为什么 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。即使在两种情况下都发生了完全相同的事情,[关于用户(..arguments..)]我在第二种情况下收到错误“预期声明”。 Sir Paul(Stanford cs193p) 说这是一个相当简单的数据库,但我花了 6 个多小时试图解决这个问题。

【问题讨论】:

    标签: ios xcode swift cs193p member-initialization


    【解决方案1】:

    for-loops 必须包含在闭包中。

    在情况 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 的声明和闭包,并在用户周围添加了[]

    【讨论】:

      【解决方案2】:

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

      [
      User(), User()
      ]
      

      但在第 2 种情况下,您不会。 这个语法:[ User(),User(),User() ] 创建一个数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-16
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2019-09-11
        • 2017-07-22
        • 2017-03-24
        相关资源
        最近更新 更多