Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为函数中的类成员赋值_Swift - Fatal编程技术网

Swift 为函数中的类成员赋值

Swift 为函数中的类成员赋值,swift,Swift,我有一个类,它有两个成员变量和一个函数。当用户导航到新情节提要并使用带有成员变量y的http GET请求为成员变量x赋值时,将调用该函数。函数完成后,我尝试将x指定给新故事板的变量,但它是nil。如何在函数中为x赋值,然后将x传递给新的情节提要 import UIKit import os.log class testViewController: UIViewController { var x: XClass! var y = “1234” override f

我有一个类,它有两个成员变量和一个函数。当用户导航到新情节提要并使用带有成员变量y的http GET请求为成员变量x赋值时,将调用该函数。函数完成后,我尝试将x指定给新故事板的变量,但它是nil。如何在函数中为x赋值,然后将x传递给新的情节提要

import UIKit
import os.log

class testViewController: UIViewController {

    var x: XClass!
    var y = “1234”

    override func viewDidLoad() {
        super.viewDidLoad()  
    }

    // MARK: - Navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        switch(segue.identifier ?? "") {
        case “ZViewController”:
            guard let zviewcontroller = segue.destination as? ZViewController else{
                fatalError("Unexpected Destination: \(segue.destination)")
            }

            loadXDetail()
            zviewcontroller.x = x


        default:
            os_log("Not ZViewController Segue", log: OSLog.default, type: .debug)
        }
    }

    private func loadX(){
        // credentials encoded in base64
        let username = “***”
        let password = “***”
        let loginData = String(format: "%@:%@", username, password).data(using: String.Encoding.utf8)!
        let base64LoginData = loginData.base64EncodedString()

        // create the request
        let url = URL(string: "https://example.com")!
        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.setValue("Basic \(base64LoginData)", forHTTPHeaderField: "Authorization")

        //making the request
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {
                print("\(error)")
                return
            }

            if let httpStatus = response as? HTTPURLResponse {
                // check status code returned by the http server
                print("status code = \(httpStatus.statusCode)")
                do {
                    let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]
                    let items = json["items"] as? [[String: Any]] ?? []
                    for dic in items{
                        //guard let api = dic["Type"] as? String else {return}
                        let a = dic[“A”] as! String
                        let b = dic[“B”] as! String
                        let c = dic[“C”] as! String

                        self.x = XClass(y: y, a: a, b: b, c: c)!
                    }
                } catch let error as NSError {
                    print(error)
                    return
                }
            }
        }
        task.resume()
    }
}

在请求完成之前,您不能在
prepare中阻止segue(对于segue
),您需要在需要导航时启动对异步方法的调用

loadX()
然后在完成
let task=URLSession.shared.dataTask(with:request)
do之后

 self.x = XClass(y: y, a: a, b: b, c: c)!
 }
 DispatchQueue.main.async {
    self.performSegue(withIdentifier:"SegueID",sender:nil)
 }
此时,根据响应,x var有一个正确的值


另外,您可能需要x作为任何数组,因为它将包含此循环中的最后一个值

                for dic in items{
                    //guard let api = dic["Type"] as? String else {return}
                    let a = dic[“A”] as! String
                    let b = dic[“B”] as! String
                    let c = dic[“C”] as! String

                    self.x = XClass(y: y, a: a, b: b, c: c)!
                }

P> >考虑使用<代码>可编辑解码您的响应而不是<代码> JSONSOLISTION/<代码>

< p>您不能阻止代码中的分段>准备(对于SeGue<代码>,直到您的请求完成,当您需要浏览

时,您需要启动对异步方法的调用。
loadX()
然后在完成
let task=URLSession.shared.dataTask(with:request)
do之后

 self.x = XClass(y: y, a: a, b: b, c: c)!
 }
 DispatchQueue.main.async {
    self.performSegue(withIdentifier:"SegueID",sender:nil)
 }
此时,根据响应,x var有一个正确的值


另外,您可能需要x作为任何数组,因为它将包含此循环中的最后一个值

                for dic in items{
                    //guard let api = dic["Type"] as? String else {return}
                    let a = dic[“A”] as! String
                    let b = dic[“B”] as! String
                    let c = dic[“C”] as! String

                    self.x = XClass(y: y, a: a, b: b, c: c)!
                }

Pl>考虑使用<代码>可编辑来解码您的响应而不是<代码> JSONSerialIt/<代码> < /P> < P> <强> SWIFT 4.2 /XCODE 10.1:< /强>

在ViewController或类之间传递数据的方法很少

最简单的方法是使用全局变量。例如:

import UIKit

var myGlobalVariable = ""  //Or any Type you need

class testViewController: UIViewController {

private func loadX(){

//Do some stuff ...

myGlobalVariable = x

}

import UIKit

class ZViewController: UIViewController {

override func viewDidLoad() {

print(myGlobalVariable)

}
或者,使用单例模式。例如:

import UIKit

var myGlobalVariable = ""  //Or any Type you need

class testViewController: UIViewController {

private func loadX(){

//Do some stuff ...

myGlobalVariable = x

}

import UIKit

class ZViewController: UIViewController {

override func viewDidLoad() {

print(myGlobalVariable)

}
创建一个类,如:

import Foundation

class  SetVariable {

    var test: String?  //Or any type you need

    private init () {}

    static let shared = SetVariable.init()
}

class testViewController: UIViewController {

private func loadX(){

//Do some stuff ...

SetVariable.shared.test = x

}

class ZViewController: UIViewController {

override func viewDidLoad() {

print(SetVariable.shared.test)

}

swift 4.2/Xcode 10.1:

在ViewController或类之间传递数据的方法很少

最简单的方法是使用全局变量。例如:

import UIKit

var myGlobalVariable = ""  //Or any Type you need

class testViewController: UIViewController {

private func loadX(){

//Do some stuff ...

myGlobalVariable = x

}

import UIKit

class ZViewController: UIViewController {

override func viewDidLoad() {

print(myGlobalVariable)

}
或者,使用单例模式。例如:

import UIKit

var myGlobalVariable = ""  //Or any Type you need

class testViewController: UIViewController {

private func loadX(){

//Do some stuff ...

myGlobalVariable = x

}

import UIKit

class ZViewController: UIViewController {

override func viewDidLoad() {

print(myGlobalVariable)

}
创建一个类,如:

import Foundation

class  SetVariable {

    var test: String?  //Or any type you need

    private init () {}

    static let shared = SetVariable.init()
}

class testViewController: UIViewController {

private func loadX(){

//Do some stuff ...

SetVariable.shared.test = x

}

class ZViewController: UIViewController {

override func viewDidLoad() {

print(SetVariable.shared.test)

}

ZViewController
viewdiload
中,无法100%保证值是在以前的vc中获取的,而且对于这个问题,使用全局变量不是一个好方法。你是对的。他必须确保值是获取的,然后进行转换。我是说这些解决方案可以用于在类之间传递数据。@Sh_KhanCombination这两个答案对
ZViewController
viewDidLoad
很有帮助。没有100%的保证值是在以前的vc中获取的,另外,在这个问题上使用globals不是一个好方法。你是对的。他必须确保获取值,然后进行转换。我说的是解决方案可用于在类之间传递数据。@Sh_Khan将这两个答案组合起来会很有帮助。这允许我在ZViewController中设置x。问题是当按下按钮时会调用loadX。如果我在storyboard中创建到ZViewController的segue,它会绕过self.performsgue。如果我在storyboard中删除segue,loadX导致了一个“No segue with identifier”错误。我通过测试override func shouldPerformSegue(with identifier identifier:String,sender:Any?)中的sender是否为零来解决这个问题->Bool
shouldPerform
是一个解决方法,但最初您应该将segue源挂接到vc本身(从IB中的圆形黄色圆圈拖动)不适用于在您单击时触发segue的按钮。这允许我在ZViewController中设置x。问题是,按下按钮时会调用loadX。如果我在序列图像板中创建segue到ZViewController,它将绕过self.performsgue。如果我在序列图像板中删除segue,loadX将导致“No segue with identifier”错误。我通过测试override func shouldPerformSegue(with identifier identifier:String,sender:Any?)中的sender是否为零来解决这个问题->Bool
shouldPerform
是一个解决方法,但最初您应该将segue源挂接到vc本身(从IB中的黄色圆圈拖动)不适用于在您单击时导致序列触发的按钮