【问题标题】:Getting wrong default value获取错误的默认值
【发布时间】:2018-11-22 05:33:13
【问题描述】:

我编写了一个自定义 TableViewCell 类,它要么返回设置在其上的 accessibilityLabel,要么只返回其类名作为 accessibilityLabel。尽管以下两种实现之一不能按预期工作。我试图理解为什么......

返回正确类名

class BaseTableViewCell: UITableViewCell {
    var _acsLabel: String?

    override var accessibilityLabel: String?{
        get{
            return _acsLabel ?? "\(type(of: self))"
        }set (newValue) {
            _acsLabel = newValue ?? ""
        }
    }
}

返回不正确的类名

class BaseTableViewCell: UITableViewCell {
    var _acsLabel: String? = "\(type(of: self))"

    override var accessibilityLabel: String?{
        get{
            return _acsLabel
        }set (newValue) {
            _acsLabel = newValue ?? ""
        }
    }
}

如果我设置了accessibilityLabel,两个版本都会正确返回值,但是如果没有设置值,它们返回的默认值是不同的。

例如,我从BaseTableViewCell 类中继承UserNameTableViewCell,然后不要自己设置accessibilityLabel

  • 正确的版本将accessibilityLabel 返回为UserNameTableViewCell
  • 不正确的版本返回 accessibilityLabel 作为返回 "(BaseTableViewCell) -> () -> BaseTableViewCell"

这是为什么?!

【问题讨论】:

  • 你的类名和你显示的输出不匹配。这些是错别字吗?
  • 这是一个错字。谢谢。固定
  • 什么是UserNameTableViewCell
  • 这是一个例子。因此,如果我从 BaseTableViewCell 类中继承 UserNameTableViewCell 并且不自己设置 accessibilityLabel,那么我希望 accessibilityLabelUserNameTableViewCell。然而它返回 "(BaseTableViewCell) -> () -> BaseTableViewCell"。现在清楚了吗?
  • 在(非惰性)属性初始化程序中使用 self 通常是编译器错误,但不幸的是,您的情况并非如此,因为 NSObjectProtocol 有一个您可以参考的 self() 实例方法to – 在这里比较我的评论stackoverflow.com/questions/50393312/…

标签: swift initialization default-value getter-setter


【解决方案1】:

self 在第二版代码中调用时并没有初始化,所以它显示了超类的名称。

如果您将该变量设置为lazy,它将不会从一开始就设置,但会在您设置myInstance.accesibilityLabel, 时正确设置,从而确保类的名称已经可用,因为self 会已初始化。

【讨论】:

  • 那个时候还没有初始化。好的。那我打印的是什么?
  • 您正在打印NSObjectProtocolself()UITableViewCell继承自UIView,实现UICoordinateSpace,继承自NSObjectProtocolUIView 实现 self()self() 的默认实现,就像有人在评论中发布(在发布答案之前没有看到它)被curried 到 (Self) -> () -> (Self),这就是你得到的。它在初始化之前可用,因为 Swift 允许您访问属性初始化器,就好像它们是 static
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2013-12-24
  • 1970-01-01
  • 2016-01-01
  • 2021-12-01
相关资源
最近更新 更多