【问题标题】:What is wrong with variable?变量有什么问题?
【发布时间】:2018-07-09 06:55:10
【问题描述】:

我读过其他关于全局变量的问题,但我的情况很特殊。

首先我在类的开头声明实例变量:

class Answers: UIViewController {
    var mystring:String!
    var mystring2:String!

然后我在 Swift 3 中通过 Alamofire 获取 json 数据:

let jsonData = result as! NSDictionary
if !(jsonData.value(forKey: "error") as! Bool) {
      let user = jsonData.value(forKey: "awdata") as! NSDictionary

      let question = user.value(forKey: "question") as! String
      print(question) // returns string "ABC"
      mystring = question
      mystring2 = "test"
}

当我在函数中使用这些变量时,变量 mystring1 返回 null,但变量 mystring2 返回 "test"

func someFunc() {
      print(mystring) // returns nothing
      print(mystring2) // returns test
}

那么为什么第一个变量没有保值,而第二个变量却记住了呢?

【问题讨论】:

  • 代码不完整。它没有显示 Alamofire 相关代码以及如何(实际上是何时)使用函数 someFunc()。我猜你的情况并不特别,它看起来像著名的 async-trap。而且 - 一如既往 - 不要在 Swift 中使用 NSDictionary,在这种情况下根本不要使用 valueForKey
  • 使用原生 [String:Any] 代替 NSDictionary。而不是 value(forKey 这是一种 KVC 方法使用 object(forKey 或 - 推荐 - 密钥订阅 (jsonData["awdata"])。

标签: swift swift3 alamofire


【解决方案1】:

如果您想要完整的答案,我认为您需要显示所有代码。 我会在您的实例变量前面加上 self 以确保您在读取或更新实例变量时实际上是在处理它们。我会避免使用 as!因为它很糟糕,尤其是在解码数据时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2022-12-06
    • 2021-04-05
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多