swift - 使用 Struct 传递变量 Swift

标签 swift variables struct

我正在尝试使用 Struct 来传递我从 Facebook Graph 请求中获得的一些变量,例如电子邮件、姓名、性别等。 我已经在“ViewController”中创建了结构(“fbDemographics”)和变量,但是当我尝试调用“SecondViewController”中的结构和变量之一时出现错误(类型“ViewController”没有成员“fbDemographics” ).我以前从未使用过 struct,所以有点困惑为什么我会收到此错误。感谢您的任何想法。两个 View Controller 的代码如下:

class ViewController: UIViewController, FBSDKLoginButtonDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    struct fbDemographics {

        static var relationship_status: String?
        static var gender: String?
        static var user_education_history: String?
        static var user_location: String?
        static var email: String?
        static var name: String?

    }     

    FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, relationship_status, gender, user_location, user_education_history, email"]).start(completionHandler: { (connection, result, error) -> Void in
        if (error == nil){
            //let fbDetails = result as! NSDictionary
            //print(fbDetails)

            if let userDataDict = result as? NSDictionary {
                fbDemographics.gender = userDataDict["gender"] as? String
                fbDemographics.email = userDataDict["email"] as? String
                fbDemographics.name = userDataDict["name"] as? String
                fbDemographics.user_location = userDataDict["user_location"] as? String
                fbDemographics.user_education_history = userDataDict["user_education_history"] as? String
                fbDemographics.relationship_status = userDataDict["relationship_status"] as? String


                let myEducation = fbDemographics.user_education_history
                let myEmail = fbDemographics.email
                let myGender = fbDemographics.gender
                let myName = fbDemographics.name
                let myStatus = fbDemographics.relationship_status
                let myLocation = fbDemographics.user_location                   

                self.performSegue(withIdentifier: "LoginToHome", sender: (Any).self)


            }


        }

第二个 View Controller

class SecondViewController: UIViewController {

@IBAction func verticalSliderChanged(_ sender: UISlider) {

        let currentValue = String(sender.value);

        sliderLabel.text = "\(currentValue)"

    func viewDidLoad() {
        super.viewDidLoad()

        ***ViewController.fbDemographics.myEmail***

    }
}

最佳答案

问题是您定义了struct inside viewDidLoad。所以范围仅限于该方法。将其移出 viewDidLoad,但仍在 ViewController 中,您应该能够从 SecondViewController 访问它。显然,您还必须修复对 myEmail 的引用,因为它称为 email。此外,在您的 SecondViewController 中,您应该从 verticalSliderChanged 方法中提取 viewDidLoad 实现; viewDidLoad 应该是 SecondViewController 的顶级实例方法,而不是在另一个方法中定义。

不过,这里还有更深层次的问题。与其将 structstatic 变量一起使用,不如创建那些简单的实例变量,创建一个 FbDemographics 类型的实例(注意,开始 struct types with uppercase letter), 然后在 prepare(for:sender:) 中传递这个实例.


例如,传递数据的正确方法是:

  • 消除静态变量;
  • 给你的struct一个以大写字母开头的名字;
  • 创建您的结构的实例;和
  • 将此实例传递给 prepare(for:sender:) 中的目标 View Controller .

例如

struct FbDemographics {
    var relationshipStatus: String?
    var gender: String?
    var userEducationHistory: String?
    var userLocation: String?
    var email: String?
    var name: String?
}

class ViewController: UIViewController {

    var demographics: FbDemographics?

    override func viewDidLoad() {
        super.viewDidLoad()

        performRequest()   // I actually don't think you should be initiating this in `viewDidLoad` ... perhaps in `viewDidAppear`
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? SecondViewController {
            destination.demographics = demographics
        }
    }

    func performRequest() {
        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, relationship_status, gender, user_location, user_education_history, email"]).start { connection, result, error in
            guard let userDataDict = result as? NSDictionary, error == nil else {
                print("\(error)")
                return
            }

            self.demographics = FbDemographics(
                relationshipStatus: userDataDict["relationship_status"] as? String,
                gender: userDataDict["gender"] as? String,
                userEducationHistory: userDataDict["user_education_history"] as? String,
                userLocation: userDataDict["user_location"] as? String,
                email: userDataDict["email"] as? String,
                name: userDataDict["name"] as? String
            )

            self.performSegue(withIdentifier: "LoginToHome", sender: self)
        }
    }

}

然后 SecondViewController 可以:

class SecondViewController: UIViewController {

    var demographics: FbDemographics!

    override func viewDidLoad() {
        super.viewDidLoad()

        let value = demographics.email  // this should work fine here
    }

}

关于swift - 使用 Struct 传递变量 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823430/

相关文章:

ios - 无法在 Swift 中生成多页 PDF

swift - SKSpriteNode .run 不工作或不完全工作

sql - 声明 VARBINARY 时使用变量指定 'size'

python - Python 函数中包含的变量值

c++ - 具有相同名称/命名空间但成员不同的结构

swift - 如何开始在 Swift 3 中重新编码 AVCaptureSession?

regex - Swift:使用正则表达式替换子字符串不起作用

c - 指针 - 困惑

c++ - 为什么结构中的 QString 有时是一个坏指针?

c++ - C++ 结构中指针的默认值