在类之间存储和传递数据的正确方法

Posted

技术标签:

【中文标题】在类之间存储和传递数据的正确方法【英文标题】:Proper way to store and pass data between classes 【发布时间】:2016-05-09 02:48:54 【问题描述】:

我有一个用户类和登录类(在单独的文件中),其中数据首先在登录类中初始化和获取,然后存储在用户类中以供将来在其他类中使用。要使用 Users 类中的变量,我似乎必须不断初始化它,这会重置类中的值。如何在不不断初始化的情况下获取变量?

现在的情况:

在 Login.swift 中接收数据 -> 数据被传递给 Users.swift -> 无法在 ViewController.swift 中显示存储在 Users.swift 中的数据

我在寻找什么:

在 Login.swift 中接收数据 -> 将数据传递给 Users.swift -> 在 ViewController.swift 中显示存储在 Users.swift 中的数据

ViewController 中的代码

import UIKit

class ViewController: UIViewController 

@IBOutlet weak var usernameLabel: UILabel!

// var usernameLabelText = String()

let dataObj = Users(Name: "", Email: "", Id: "", ProfilePicture: "", Username: "")

var usernameLabelText: String? 
    return String(dataObj!.username)


override func viewDidLoad() 
    usernameLabel.text = "Welcome \(usernameLabelText)"
    print("This is the \(dataObj!.username)")


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.




Login.swift 中的代码

import Foundation
import Alamofire
import SwiftyJSON
class Login 

var userName:String!
var passWord:String!

init(userName : String, passWord : String) 

    let parameters = [
        "username": userName,
        "password": passWord 
    ]

    Alamofire.request(.POST, "http://anyapi.com", parameters: parameters)
        .responseJSON  response in
            print(response.request)
            print(response.response)
            print(response.data)
            print(response.result)
            if let result = response.result.value 
                print("Did receive JSON data: \(result)")
                let value = JSON(result)
                if let api_key = value["api_token"].string 
                    print("The token is " + api_key)
                 else
                    print("error parsing api token")
                
             //pass data to Users class
               _ = Users.init(Name: value["name"].string, Email: value["email"].string, Id: value["id"].string, ProfilePicture: value["profile_picture"].string, Username: value["username"].string)
            
            else 
                print("JSON data is nil.")
            


    



Users.swift 中的代码

import Foundation
import Alamofire
import SwiftyJSON

class Users 
private var _name: String!
private var _email: String!
private var _userId: String!
private var _profilePicture: String!
private var _username: String!

var particulars: [String] = []

var name: String 
    _name = particulars[0]
    return _name


var email: String 
    _email = particulars[1]
    return _email


var userId: String 
    _userId = particulars[2]
    return _userId


var profilePicture: String 
    _profilePicture = particulars[3]
    return _profilePicture


var username: String 
      _username = particulars[4]
    return _username



required init?(Name: String?, Email: String?, Id: String?, ProfilePicture: String?, Username: String?) 
    particulars += ["\(Name)"]
    particulars += ["\(Email)"]
    particulars += ["\(Id)"]
    particulars += ["\(ProfilePicture)"]
    particulars += ["\(Username)"]



【问题讨论】:

【参考方案1】:

    在视图控制器中创建一个用户类型变量。

    var usrData : Users?
    

    当您实例化视图控制器时,将变量分配给已经初始化的用户类。

    let view_controller_to_present = blahblah as! View Controller;<br>
    view_controller_to_present.usrData = DataFromRequest;<br>
    presentViewController(_ viewControllerToPresent: view_controller_to_present,animated flag: true, completion completion: nil);
    

    访问数据。

【讨论】:

【参考方案2】:

有很多话要说...

关于存储: 您的数据尚未存储。您可以使用 Core Data 来持久化它们,也可以使用 NSUserDefault 来实现更轻量级的解决方案(后者不会在应用终止后持久化数据),甚至是文件。

关于将数据从一个视图传递到另一个视图: 您可以覆盖 prepareForSegue 函数,或使用协议和委托模式。

【讨论】:

以上是关于在类之间存储和传递数据的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

在类组件和函数之间传递数据(React)

在视图控制器之间移动和传递数据的正确方法

在类方法之间传递一个 QImage 对象

在 Redux 中处理数据传递的正确方法是啥

C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是啥

过程的通讯:共享存储音讯传递和管道通讯