说实话,我无法提供更好的标题,所以如果有人能提出更有意义的内容,那就太好了。
不久前,我看到了 Andy Matuschak 的精彩演讲让我们一起玩:重构巨型 Controller !。他展示了很好的模式:使用结构将数据注入(inject) View ,将 View 的内部结构与 View Controller 分离。 事情是这样的:
class TaskTableViewCell: UITableViewCell {
struct ViewData {
let title: String
let timingDescription: String
}
var viewData: ViewData? {
didSet {
textLabel!.text = viewData?.title
detailTextLabel!.text = viewData?.timingDescription.lowercaseString
}
}
}
现在如您所见,在 viewData
的 didSet
中,我们更新了 的
。好吧,实际上是 textLabel
和 detailTextLabel
TaskTableViewCellUITableViewCell
因为它们都是继承的属性。
但这是基本的表格 View 单元格,我想要一些定制的东西。我添加了 someText
属性和必需的 inits。现在,类如下所示:
class TaskTableViewCell: UITableViewCell {
struct ViewData {
let title: String
let timingDescription: String
}
var viewData: ViewData? {
didSet {
textLabel!.text = viewData?.title
detailTextLabel!.text = viewData?.timingDescription.lowercaseString
}
}
var someText: String
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
someText = ""
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
当然,我想更新 someText
,比如说 ViewData
结构的 title
属性。
/// In didSet
someText = viewData?.title
这给了我以下错误:
TaskTableViewCell.swift:21:34: Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?
这很奇怪,因为 TaskTableViewCell
和 ViewData
中都没有可选字符串。
我可以解决这个问题
someText = (viewData?.title)!
或者
someText = viewData!.title
但我想避免强制展开。
你能向我解释一下这里发生了什么吗?
为什么编译器在分配继承属性时不打印错误?
最佳答案
someText = viewData?.title
someText 不是可选的,struct 中的属性 title 不是可选的,但是 struct viewData 的实例是可选的,因此 viewData 的 title 是可选的。所以编译器会给出错误。
UILable的属性文本是可选的,默认值为nil。所以
textLabel!.text = viewData?.title
没问题。
关于ios - 子类内部的结构,分配给 self 时解包可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37520467/