【问题标题】:Why can i not append an element to a struct? [duplicate]为什么我不能将元素附加到结构? [复制]
【发布时间】:2018-09-10 17:39:32
【问题描述】:

这是我的代码:

import UIKit

struct StructName{
    var name: String?
    var specs: [Spec]?

    init(specs: [Spec]? = nil, name: String? = nil) {
        self.specs = specs
        self.name = name
    }

}

struct Spec{
    var name: String
    var title: String
    var content: String
    var display: Bool
}

class ViewController: UIViewController {
    var structNames: [StructName] = []
    var specs = [Spec]()

    override func viewDidLoad() {
        super.viewDidLoad()
            specs.append(Spec(name: "Name_1", title: "Title_1", content: "Content_1", display: false))
            structNames.append(StructName(name: "Name_3"))
            structNames.append(StructName(name: "Name_4"))
            structNames.append(StructName(name: "Name_1"))

            append()
            print(structNames)
    }


    func append(){
        for i in specs{
            let index = structNames.index { (structName) -> Bool in
                structName.name == i.name
            }
            print(structNames[index!].name)

            structNames[index!].specs?.append(Spec(name: "a", title: "a", content: "a", display: false))
        }
    }


}

为什么这不起作用?

        structNames[index!].specs?.append(Spec(name: "a", title: "a", content: "a", display: false))

它应该打印这个:

[test.Utility(utility_name: Optional("Name_3"), specs: nil), test.Utility(utility_name: Optional("Name_4"), specs: nil), test.Utility(utility_name: Optional("Name_1" "), specs: "SPEC I APPENDED")]

您可能理解,我想将给定的 Spec 附加到特定索引。

【问题讨论】:

  • 因为structNames实例的specsnil
  • 你是说我应该把我的默认初始化器改成别的东西吗?
  • 是的,只要给它一个默认值var specs: [Spec] = []
  • 谢谢你的工作,只要回答,我会接受。

标签: arrays swift struct


【解决方案1】:

您永远不会将每个StructNamespecs 属性初始化为nil 以外的任何值。因此,当您引用 structNames[index!].specs 时,specsnil 并且可选链接跳过对 append 的调用。

一种解决方案是将specs 初始化为一个空数组,而不是nil

struct StructName{
    var name: String?
    var specs: [Spec]

    init(specs: [Spec] = [], name: String? = nil) {
        self.specs = specs
        self.name = name
    }
}

仅供参考 - 你真的想要一个可选的name吗?

【讨论】:

  • 我需要它为 nil,这只是一个来自具有嵌套 json 响应的项目​​的示例。
  • 但是在你的问题下面的 cmets 中你说这有效。
  • 是的,给一个空数组的默认初始化程序。我正在和你谈论“名字”的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 2011-06-03
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多