允许signin类全局拥有共享实例

时间:2017-06-01 05:05:11

标签: ios swift swift3

我有这个类Signin,当用户使用用户名,密码登录时会初始化它,但它也会获取并设置uname,密码到密钥链。我将在代码中的其他地方使用此Signin类,但我不希望每次都创建一个新实例,但是当用户第一次登录时,应该初始化然后在整个应用程序中,同一个实例应该是除非用户决定退出,否则使用。

我在AppDelegate中声明并创建了这个类的实例,我的登录代码是。

var signin: SignIn?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

signin = SignIn(username: fullName!, password: "")

}

以下是我班级的样子:

class SignIn {
    let username: String
    let password: String
    let keychain = KeychainSwift()

    init(username: String, password: String) {
        self.username = username
        self.password = password
    }

    func getUsername() -> String {
        if (keychain.get("username") != nil) {
            return keychain.get("username")!
        }
        return ""
    }

    func setUsername(username: String) {
        keychain.set(username, forKey: "username")
    }

    func getPassword() -> String {
        if (keychain.get("password") != nil) {
            return keychain.get("password")!
        }
        return ""
    }

    func setPassword(password: String) {
        keychain.set(password, forKey: "password")
    }
}

但是当我尝试访问它时,可以在ViewController中说“欢迎用户名”。我做这样的事情:

class ViewController: UIViewController {
    @IBOutlet weak var welcomeText: UITextField!
    var signIn: SignIn?

    override func viewDidLoad() {

        let username: String = signIn!.getUsername()
         welcomeText.text = "Welcome \(username)"
    }
}

这是正确的方法吗?我如何以这样的方式创建类,以便获得Signin类的共享实例,并且相同的实例在任何地方共享,并且在注销时,我取消初始化类。

3 个答案:

答案 0 :(得分:1)

您可以使用单身模式,如下所示:

class SignIn {
    static let sharedInstance = SignIn()

// your code
}

在此之后,您可以使用

访问sharedInstance
SignIn.sharedInstance
来自代码中的任何地方的

答案 1 :(得分:0)

尝试这样的事情:

class SignIn {
    let username: String
    let password: String
    static let sharedInstance = SignIn()
    let keychain = KeychainSwift()

    // Initialization

    private init() {
        self.username = keychain.get("username")!

        self.password = keychain.get("password")!

    }

}

登录成功后,您必须在钥匙串中设置用户名和密码并致电SignIn.sharedInstance,然后您可以随时随地访问用户名和密码,如下所示:

    let signIn = SignIn.sharedInstance
    print("Username ="+signIn.username)
    print("Password ="+signIn.password)

希望它有所帮助。

答案 2 :(得分:-1)

class User {

    static let sharedInstance = User()

    var name :String?
    var phoneNumber : String?



    func initializer(_ nm : String , ph : String){
        name = nm
        phoneNumber = ph
    }
}

使用

初始化它
User.sharedInstance.initializer("Jen", ph: "2323")