Swift 为函数中的类成员赋值
我有一个类,它有两个成员变量和一个函数。当用户导航到新情节提要并使用带有成员变量y的http GET请求为成员变量x赋值时,将调用该函数。函数完成后,我尝试将x指定给新故事板的变量,但它是nil。如何在函数中为x赋值,然后将x传递给新的情节提要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
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是否为零来解决这个问题->BoolshouldPerform
是一个解决方法,但最初您应该将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是否为零来解决这个问题->BoolshouldPerform
是一个解决方法,但最初您应该将segue源挂接到vc本身(从IB中的黄色圆圈拖动)不适用于在您单击时导致序列触发的按钮