【问题标题】:Can't access class object variable无法访问类对象变量
【发布时间】:2016-01-29 20:26:19
【问题描述】:

我正在使用 Swift 2 创建一个函数,该函数从我编写的类中创建一堆对象。

现在,问题是当我添加一个新对象时我没有问题,我从函数和它存储数据的 init() 函数中多次检查。 (从 init() 函数打印 self.myVariable 有效)。

但是,当我稍后去检索我的变量时,例如

 if let dog: Animal? = Animal.init(id : "12345"){
print(dog?.legs)}

即使我签入了 Animal 类并且它成功地初始化了 Animal 对象“dog”,它也打印出 nil。

如果有人知道为什么会发生这种情况,那将非常有用和感激。

这是实际代码的链接,Animal 类只是一个示例,但这可能更有用:Class & Function

【问题讨论】:

  • 能否提供 Animal 类的代码?问题很可能存在,而不是您在此处显示的代码。
  • 为什么是Animal?类型的狗?请显示更多周围的代码。
  • 这是函数的代码:link,这是类的代码:link。 Animal 类只是一个简化的例子,但我想我没有解释得那么好!如果您有任何问题,请告诉我!感谢您的帮助!

标签: ios swift class oop variables


【解决方案1】:

这是对您的课程代码here的回应。

在您的 init 函数中,您永远不会设置类变量 id。你可以这样设置:

query.getObjectInBackgroundWithId(id as String) { (object: PFObject?, error: NSError?) -> Void in

        if error != nil {
            print(error)

        }
        else {
            if let atm = object {
            print("ATM found")
            self.bank = atm["bank"] as? NSString
            self.type = atm["type"] as? NSNumber
            self.location = atm["location"] as? PFGeoPoint
            self.description = atm["description"] as? NSString

            // Set id to whatever you'd like here
            self.id = atm.objectId!
            }
        }
    }

【讨论】:

  • 确实如此,谢谢。现在我添加了用于设置 id 的行,但是当从我在函数 ATMsAroundMe(myLocation : PFGeoPoint) 中创建的对象“结果”中提取变量时,它仍然返回 null。你知道还有什么可能导致这个问题吗?
  • 太棒了!因为您正在初始化一个可选类型(让结果:ATM?),所以允许该值为零。很可能是整个结果:ATM?实例为零。所以很可能你的 ATM.init() 失败了。
  • 我的 init() 是否会失败,即使我放入其中的一些打印语句以测试它是否正常工作并显示有关该项目的下载信息?
【解决方案2】:

我不熟悉 PFQuery,但由于它使用的是完成处理程序,因此它异步响应对 getObjectInBackground 的调用。这意味着当您从 init(id:...) 获取对象时,它在 bank 字段中还没有值。所以 result?.bank 打印 nil 是因为 bank 是 nil,而不是因为 result 是 nil。

一旦完成处理程序被执行,bank 就会有它的值(如果没有发生错误),但是这不太可能在 init() 和你的 let 结果之间的短时间内发生:ATM? = ...条件。

【讨论】:

  • 好的,我想我明白了,但是我的 init(id: ...) 函数应该用通过 Parse.com 从服务器检索到的各种数据填充对象。如果您说从服务器检索数据比初始化对象需要更多时间,那么我将如何解决这个问题,以便它也需要尽可能长的时间,但我得到一个“填充”对象最后,所有参数都已经从服务器下载了吗?
  • 您需要以不同的方式构建代码。异步交互要求 ATM 对象的设计也异步提供其服务。至少它必须提供自己的完成处理程序,以便在初始化完成时可以通知调用代码。您将无法将完全初始化的对象返回给调用者。为了让您了解时差,网络调用以毫秒为单位。初始化一个对象可以快到几纳秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 2018-06-04
  • 2015-07-09
  • 2013-04-29
  • 2016-12-27
  • 2014-06-04
相关资源
最近更新 更多