我如何全局访问结构的实例?

问题描述 投票:0回答:4

我是编码新手,如果这是一个愚蠢的问题,请原谅。

我的应用程序有一个注册页面,后跟主屏幕。在“注册”页面上,用户输入其姓名和电子邮件ID进行注册。我在定义用户对象时使用了以下结构:

public struct User {
    let email: String
    let name: String
}

let user = User(email: "[email protected]", name: "Paul")

现在,此用户对象在signUp视图中定义,但是我希望能够全局引用其属性。也就是说,在我的主页中,我希望能够包含一条消息:

let welcomeMessage = "Welcome, \(user.name)"

我说的可能吗?

或者我是否应该使用结构以外的其他东西来全局访问User结构的一个且唯一保存的实例?

swift struct global
4个回答
0
投票

听起来您正在尝试在本地保存用户数据。如果是这种情况,则应检查here。标记为正确的答案已于2019年更新,因此仍应是相关的。


0
投票

对于这种情况,有时我喜欢使用静态current用户。例如:

struct User {

    private(set) static var current: User?

    let email: String
    let name: String

    static func login(name: String, email: String) {
        current = User(name: name, email: email)
    }

}

然后,您可以在代码中的任何位置访问User.current。您也可以有多个用户,但只有一个current用户。此方法符合this相关的SO问题。


0
投票

您可以将User上的属性声明为静态,这将使该值可在应用程序中的任何位置访问。但是有一个警告,您一次不能有一个以上的用户实例。

struct User {
    static var email: String?
    static var name: String?
}

使用属性时,可以直接在用户类型上访问它们。

User.email = "[email protected]"
User.name = "John Doe"

print(User.email)
print(User.name)

0
投票

您可以通过几种方式完成

传递值

注册完成后即可通过。我确定一旦完成注册。注册完成后,您必须在代码中的某处初始化HomeViewController。在HomeViewController中定义用户属性,然后为user设置属性

示例代码

// You user struct
struct User {
    let email: String
    let name: String
}


class SignUpViewController: UIViewController {

    let user = User(email: "[email protected]", name: "Paul")

    // Assuming you have a function which is called on signup is done

    func didSignUpCompleted() {
        // intialise the hoemviewcontroller(assuming you have storyboard)
        let storyboard = UIStoryboard(name: "youstoryboarname", bundle: nil)
        let homeViewController =  storyboard.instantiateViewController(withIdentifier: "homeViewControllerIdentifier") as! HomeViewController
        homeViewController.user  = user
        // If the viewcontroller is embeded in UINavigation controller
        self.navigationController?.pushViewController(homeViewController, animated: true)
    }
}


class HomeViewController: UIViewController {
    // You can use it further as per your need
    var user: User?

}

单一设计模式

[如果您有一个用例,可能需要在多个地方使用此特定user信息,则可以创建一个包含该用户信息的单例类。在此定义该用户属性。调用HomeViewcontroller时进行设置。

class AppSession {
    static let shared = AppSession()
    var user: User?
    private init() { }
}


//Example lets assume below function is called once signup is completed

func didSignUpDon() {
     AppSession.shared.user = User(email: "[email protected]", name: "Paul")
}

//Later on you can access it from anywhere like this
let user = AppSession.shared.user
© www.soinside.com 2019 - 2024. All rights reserved.