【问题标题】:String property returning different values when used directly or in string interpolation直接使用或在字符串插值中使用时返回不同值的字符串属性
【发布时间】:2018-07-30 03:22:11
【问题描述】:

我刚刚调试完我的一些标签没有显示任何文本的情况,尽管有问题的字符串肯定包含一个值(它正在打印之前的行)。我最终将其固定为根据我访问字符串的方式返回不同的值。请注意,我不是在寻找解决此问题的方法,我正在寻找一个我想知道为什么会发生这种行为的原因。

我有一个带有以下可选字符串属性的协议,默认设置为nil

protocol SomeProtocol {
    var titleString: String? { get }
}

extension SomeProtocol {
    var titleString: String? {
        return nil
    }
}

这是在一个具有非可选字符串的类中实现的,在其他地方设置了title

class SomeClass: SomeProtocol {
    var title: String
    var titleString: String {
        return title
    }
}

当尝试从SomeClass 对象访问titleString 的值时,它总是返回nil,而不管title 属性如何。这是通过分配给如下标签看到的:

label.text = someClassInstance.titleString

但是,当我通过打印值或设置标签时

label.text = "\(someClassInstance.titleString)"

一切正常,它显示了文本。

我已经将它的来源缩小到我用一个非可选属性覆盖了 optional 属性的地方。显然,当我直接访问该属性时,它由协议实现返回,而通过字符串插值使用它则返回类一。这种行为背后的真正原因是什么?

编辑:要演示此行为,请在 Xcode 操场上运行此要点: https://gist.github.com/CaileanWilkinson/357c17f36d04b522b9bcf1241a825d9f

【问题讨论】:

  • 您能否发布实际重现该问题的代码?我在 Xcode 9.4 操场上尝试了您的代码,但无论哪种方式我都没有看到 nil
  • @rmaddy 尝试将其分配给标签的 text 属性,然后在您的 Playground 中打印标签的 text
  • @rmaddy 显示在这个要点的代码中:gist.github.com/CaileanWilkinson/…
  • 使用标签的 text 属性允许我重现该问题。
  • 因此,如果已知结果为String?,则调用返回类型为String?titleString。如果已知结果为String,则调用返回类型为StringtitleString。我不知道这在某种程度上是否是一个错误,但它足以避免这个问题。

标签: swift


【解决方案1】:

我觉得这与我的question 的解决方案有些相似。在那个问题中,还有两个几乎相同的属性——一个是可选的,另一个是非可选的。我也遇到过类似的情况,Swift 无法确定我想要哪个属性。

SomeClass 中的 titleString不会覆盖协议中的 titleString 属性。这反映在 Xcode 的建议中:

您可以像这样访问这两个属性:

someObject.titleString as String // accesses the one in SomeClass
someObject.titleString as String? // accesses the one in the protocol

我的意思是表达式的类型很重要。如果 swift 期望的表达式类型是 String,那么它会解析为 SomeClass 中的那个。如果表达式的预期类型是String?,则它的计算结果为协议中的类型。

这解释了为什么不使用字符串插值设置标签的文本会调用协议中的属性(label.textString?,因此它需要一个 String?)以及为什么使用字符串插值会调用 SomeClass 中的属性(字符串插值需要一个非可选的)。

【讨论】:

  • 啊,我明白了。因此,与其说是 Swift 问题,不如说 AppCode 中存在一个错误(在某种程度上可以理解)显示 SomeClass.titleString 实现了 SomeProtocol.titleString 属性。
猜你喜欢
  • 2022-01-03
  • 2019-07-05
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多