【问题标题】:I'm stuck on an Exercise in App Development with Swift (Ch. 2.3, Ex. 9). How do I use Type Properties correctly here?我坚持使用 Swift 进行应用程序开发练习(第 2.3 章,第 9 章)。如何在这里正确使用类型属性?
【发布时间】:2018-03-23 03:54:34
【问题描述】:
  1. 假设您有一个需要用户登录的应用程序。您可能有一个类似于下图所示的 User 结构。但是,除了跟踪特定的用户信息之外,您可能还想知道当前登录的用户是谁。在下面的User 结构上创建currentUser 类型属性,并将其分配给代表您的user 对象。现在您可以通过 User 结构访问当前用户。打印出currentUser的属性。

    struct User {
        var userName: String
        var email: String
        var age: Int
        static var currentUser = User(userName: "Bob", email: "bob@gmail.com", age: 18) //This line was typed by me.
    
        // My answer for the 2nd part.
        mutating func logIn(user: User) {
            currentUser = user
            print("\(userName) has logged in.")
        }
    }
    

    打印(User.currentUser)

  2. User 结构关联的其他属性和操作可能是类型属性或方法的良好候选者。一个可能是一种登录方法。返回并创建一个名为logIn(user:) 的类型方法,其中user 的类型为User。在方法的主体中,将传入的用户分配给currentUser 属性,并使用用户的用户名打印出一条声明用户已登录的语句。

在下面,调用logIn(user:) 方法并传入与您在上面分配给currentUser 的User 实例不同的实例。观察控制台中的打印输出。

编辑:想通了!

struct User {
    var userName: String
    var email: String
    var age: Int
    static var currentUser = User(userName: "Bob", email: "bob@gmail.com", age: 18)

    static func logIn(user: User) {
        currentUser = user
        print("\(currentUser.userName) has logged in.")
    }
}

print(User.currentUser.userName) //Bob
print(User.currentUser.email)    //bob@gmail.com
print(User.currentUser.age)      //18

var newUser = User(userName: "Joey", email: "joey@yahoo.com", age: 20)
User.logIn(user: newUser)     //Joey has logged in.

print(User.currentUser.userName) //Joey
print(User.currentUser.email)    //joey@yahoo.com
print(User.currentUser.age)      //20

【问题讨论】:

    标签: swift xcode


    【解决方案1】:
    struct User {
        var userName: String
        var email: String
        var age: Int
        
        static var currentUser = User(userName: "Arminius", email: "arminius@me.com", age: 36) 
        //this sets up a 'default' user profile so it isn't blank.
                    
        mutating func logIn(userName: String, email: String, age: Int) {
            // this function changes the 'default' user and logs in a new user
            self.userName = userName
            self.email = email
            self.age = age
            print("\(userName) has logged in successfully.")
        }
    }
    

    然后您将通过User.currentUser.logIn() 调用logIn(user:) 函数,登录一个新用户。我不知道我们的解决方案有何不同,但对我来说,创建newUser 然后将其分配给currentUser 似乎更清楚,但是已经两年了,您的解决方案确实为我指明了正确的方向。

    【讨论】:

      【解决方案2】:

      当我运行您的代码时,我得到以下输出“Bob 已登录。”您的程序可以运行。这是我的代码:

         struct User {
          var userName: String
          var email: String
          var age: Int
          static var currentUser = User(userName: "Bob", email: "bob@gmail.com", age: 18) //This line was typed by me.
          // My answer for the 2nd part.
          mutating func logIn(user: User) {
              User.currentUser = user
              print("\(userName) has logged in.")
          }
      }
      

      你到底希望你的结果是什么?

      【讨论】:

      • 顺便说一句,你不能在 Struct 之外引用 currentUser。
      • 大部分代码都是为问题预先输入的。问题是要求我创建一个类型属性,我可以在其中访问当前登录用户的详细信息。第二个问题是要求我创建一个新的 User 实例,然后使用 logIn(user:) 方法将 currentUser 更改为具有新用户详细信息的新用户。然后会出现一条确认消息,说明新用户的名称已登录。
      • 这里也有人问过同样的问题,但是答主没有给出明确的答案,因为他想让提问者弄清楚。 stackoverflow.com/questions/46125022/…
      • 即使你没有真正给出完整的答案,但你确实帮助我意识到“User.currentUser = user”而不是“currentUser = user”是让我失望的代码.我批准了您的回答,因为您是唯一一个试图提供帮助的人。我编辑了我的问题以显示我需要回答这些问题。
      • 实际上,我再次修复了它,因为它希望我使用静态函数而不是变异函数。这使得“User.currentUser = user”会导致错误,但“currentUser = user”是正确的。我会让你保留批准的答案点或其他任何东西(我是新手)。我用本书希望我做的方式编辑了我的问题(通过使用类型属性和类型方法)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多