结构:Swift Playground 不打印用户名

Structures: Swift Playground doesn't print username

我是 Swift 的新手,目前正在尝试解决一个问题。我必须创建一个 struct 并且它需要将 userRichard 的状态打印到控制台。这里唯一的问题是我用于 isActive 的打印语句不适用于 userRichard.name,它在将 isActive 打印到控制台时将该部分留空。

这是为什么?

struct User {
    let name: String
    var email: String?
    var followers: Int
    let isActive: String
    
    init(name: String, email: String?, followers: Int, isActive: String) {
        self.name = name
        self.email = email
        self.followers = followers
        self.isActive = isActive
        logStatus()
    
    }
    
    func logStatus() {
        print("\(userRichard.name) is \(isActive)")
    }

}

var userRichard = User(name: "Richard", email: "richard@icloud.com", followers: 0, isActive: "not active")

//prints:  is not active

我想我知道这里发生了什么...

让我们分解一下代码中的内容:

此处最外层大括号之间的所有内容都与 User 结构相关联。您已正确设置所有属性并且初始化程序看起来不错。暂时忽略初始化程序中的 logStatus() 调用。

接下来,您有一个 'logStatus' 方法声明,它可以应用于您创建的每个 User 实例。

struct User {
let name: String
var email: String?
var followers: Int
let isActive: String

init(name: String, email: String?, followers: Int, isActive: String) {
    self.name = name
    self.email = email
    self.followers = followers
    self.isActive = isActive
    logStatus()

}

func logStatus() {
    print("\(userRichard.name) is \(isActive)")


   }

}

所以问题是什么?

我认为这里的问题是您在初始化程序中调用 'logStatus()' 函数,在它有机会完成之前。

如果您按如下方式重组代码,它将起作用:

struct User {
let name: String
var email: String?
var followers: Int
let isActive: String

init(name: String, email: String?, followers: Int, isActive: String) {
    self.name = name
    self.email = email
    self.followers = followers
    self.isActive = isActive
}

func logStatus() {
    print("\(name) is \(isActive)")
}

}

var userRichard = User(name: "Richard", email: "richard@icloud.com", followers: 0, isActive: "not active")
userRichard.logStatus()

我已经从 logStatus() 函数的 .name 位中删除了 'userRichard'。这意味着如果您在 User 结构的任何实例上调用它,它将显示相应的名称。

接下来,我在用户的 'userRichard' 实例上调用了该函数 - 在它被初始化之后。如果您创建了一个单独的 'userPete' 实例等,同样的方法也应该有效。

希望这是有道理的。