ios - 子类内部的结构,分配给 self 时解包可选

标签 ios swift struct option-type

说实话,我无法提供更好的标题,所以如果有人能提出更有意义的内容,那就太好了。

不久前,我看到了 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
        }
    }
}

现在如您所见,在 viewDatadidSet 中,我们更新了 textLabeldetailTextLabel TaskTableViewCell。好吧,实际上是 UITableViewCell 因为它们都是继承的属性。

但这是基本的表格 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 '?'?

这很奇怪,因为 TaskTableViewCellViewData 中都没有可选字符串。 我可以解决这个问题 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/

相关文章:

swift - 为什么在 swift 中变量选项是在函数中而不是在 Playground 中

c - 不兼容的指针类型警告 C

c - 将 malloc 与结构一起使用

c++ - 使用 c 中结构的 malloc 对内存块进行索引

swift - 在 swift 中使用 tableView(可扩展单元格)制作嵌套的 Accordion 菜单

Swift:将凭据与 Firebase 和用户名的附加文本字段一起使用

ios - PageViewController 使我的 PickerView 不出现

ios - CvVideoCamera - 相机不可用,Iphone 模拟器

ios - JSON 转 TableView 难度

ios - iCloud 核心数据存储的自定义迁移选项