【发布时间】: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,则调用返回类型为String的titleString。我不知道这在某种程度上是否是一个错误,但它足以避免这个问题。
标签: swift