【问题标题】:Swift nil Optional String = Empty StringSwift nil 可选字符串 = 空字符串
【发布时间】:2015-10-28 12:01:04
【问题描述】:

这个对我来说根本没有意义。我有一个需要几个字符串的结构:

public struct Organization {
  let id: String
  let name: String
  let legacyID: String?
  let rID: String?

  public init(id: String, name: String, legacyID: String?, rID: String?) {
    self.id = id
    self.name = name
    self.legacyID = legacyID
    self.rID = rID
  }
}

请注意,legacyIDrID 是可选的。但是,如果我尝试将它们中的任何一个设置为nil.None,它们将被设置为""(空字符串)。例如:

let org = Organization(id: company.companyID, name: company.name, legacyID: company.context, rID: nil)

然而,当我尝试访问rID 时,它显示为"" 而不是nil。我什至尝试在init 中直接设置nil,它仍然设置为""。这弄乱了我的平等检查。有谁知道怎么回事?

注意:这是 Swift 1.2

【问题讨论】:

  • 我无法重现此行为。您可以发布演示这一点的整个代码吗?
  • 不,我真的不能……至少现在不行。我无法在一个小型独立项目中进行复制,而且我很确定如果我发布他们的整个代码库,我的雇主会解雇我……更不用说它是成千上万行代码!
  • @mattt 我正在使用模块/动态框架......并且组织是在模块中定义的,但在“主”应用程序中设置。这可能是原因吗?我在这里抓着稻草。我已经解决了这个问题,但它的存在让我很困扰。
  • 我不是要你的代码库。足以重现问题。
  • 是的,对不起。在一些时间压力下,无论如何我都无法在较小的项目中进行复制。但是这个问题在主要项目中仍然存在。但是,我知道是调试器出了问题。当我使用 println 而不是从调试器打印时,实际代码会产生正确的结果。

标签: string swift struct optional


【解决方案1】:

所以问题出在调试器上。如果我使用调试器检查该值,即使在调试器提示符下,p/po/print org.rID 它也会返回不正确的值。但是,在我的代码中插入println(org.rID) 会打印出正确的值nil。当我不能信任调试器时,我讨厌它。当他们也从gcd 切换到lldb 时发生了。希望这在 Xcode 7 中得到解决。

【讨论】:

    【解决方案2】:

    你得到“”作为输出,因为你的数据类型是字符串。因此,如果任何 String 变量为空或 nil,它总是显示“”。使用 String 类型不能将 nil 作为输出。即使您直接分配 nil 也不会发生相同的输出。

    编辑: 这是我从你的代码中得到的。它工作正常。

    【讨论】:

    • 但是我的数据类型不是String,而是String?,这是一个Optional。所以将值设置为nil.None 应该可以工作。
    • 检查我编辑的答案。您的代码似乎工作正常。检查您访问的方式是否正确。
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多