【问题标题】:Xcode warning - variable was never mutatedXcode 警告 - 变量从未发生过变异
【发布时间】:2017-08-17 15:41:32
【问题描述】:

我知道这是新手问题,但我在 stackoverflow 或谷歌上找不到答案。

我开始使用 Swift 3 语言编写项目。这是我的模型类:

class VKUserProfile: NSObject {
    var userId: NSNumber?
    var userName: String?
    var userEmail: String?
    var userMobilePhone: String?
    var userPictureUrl: URL?
}

然后我在另一个类中使用它:

private func convert(user: Dictionary<String, Any>) -> VKUserProfile {
    var currentUser: VKUserProfile = VKUserProfile()
    currentUser.userId = user["id"] as? NSNumber
    return currentUser
}

Xcode 在“var currentUser: VKUserProfile = VKUserProfile()”行警告我。好的,但是当我将其更改为“让 currentUser:VKUserProfile = VKUserProfile()”时 - 我无法设置任何属性(对象为空)。那么有人可以描述一下这个过程,为什么 Xcode 会发出警告以及我该如何解决这个问题。

更新: 这是让 currentUser 时 currentUser 变量的屏幕截图:

这是 currentUser 为 var 时 currentUser 变量的截图:

提前谢谢!

【问题讨论】:

  • 您需要使用let。这解决了你的直接问题。现在澄清一下“我无法设置任何属性”的意思。
  • 您确定user 具有给定键的值并且该值属于给定类型吗?你真的需要edit你的问题是关于设置属性的问题而不是let/var的使用。
  • 问题可能出在 Xcode 显示信息上吗?我敢打赌,当您使用let 时,数据实际上就在那里,就像您使用var 时一样。不要相信 Xcode 的调试器。
  • 当你print(currentUser)时,它不会显示属性的值。它仅适用于 struct 类型或您已符合 CustomStringConvertible 协议并实现 description 属性以显示属性值的情况。
  • 我明白这一点。我的观点仅仅是,使用自定义 class 类型,您也不能只是 print 对象并期望看到这些值。除非您符合CustomStringConvertible,否则您只会看到地址。

标签: ios swift


【解决方案1】:

好像你用的时候:

var currentUser = VKUserProfile()

您的其余代码正确填写currentUser,您可以在打印currentUser时看到这些值。

但使用 var 会发出警告,因为您实际上从未重新分配 currentUser

因此,您正确地将 var 更改为 let 并且不进行其他更改。但是现在,当您打印 currentUser 时,您看到的输出与使用 var 时不同,如您在问题中发布的屏幕截图所示。

这似乎是 Xcode 的调试器的问题。

打印currentUser 的各个属性会显示预期的输出。

所以说到底,这不过是 Xcode 调试器中的一个错误。即使将var 更改为let,您的代码也没有问题。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
相关资源
最近更新 更多