【问题标题】:Swift data missing in optional array可选数组中缺少 Swift 数据
【发布时间】:2021-12-30 10:47:29
【问题描述】:

我对此感到非常困惑。我将数据附加到一个可选数组,但它就消失了。这是进一步解释的代码:

问题出在哪里:

private func toObject(from data: GetOldDistrSrvMenuQuery.Data.GetOldDistrSrvMenu) -> GetOldDistrSrvMenu {
    let obj = GetOldDistrSrvMenu()
    obj.title = data.title
    obj.subtitle = data.subtitle
    obj.buttonText = data.buttonText
    obj.buttonShow = data.buttonShow ?? false
    obj.buttonUrl = data.buttonUrl
    
    if let items = data.items {
        for item in items {
            if let item = item {
                let aa = toDataObject(from: item)
                obj.items?.append(aa)
                
                print("Debug1: \(aa.name)") // data exist as expected
                print("Debug2: \(obj.items)") // nil in obj, why?
            }
        }
    }
    
    return obj
}

toDataObject 函数:

private func toDataObject(from data: GetOldDistrSrvMenuQuery.Data.GetOldDistrSrvMenu.Item) -> GetOldDistrSrvMenuItem {
    let obj = GetOldDistrSrvMenuItem()
    obj.sourceUrl = data.sourceUrl
    obj.thumbnailUrl = data.thumbnailUrl
    obj.name = data.name
    
    return obj
}

GetOldDistrSrvMenu 对象:

class GetOldDistrSrvMenu: Object {
   @objc dynamic var _id: String = UUID().uuidString
   @objc dynamic var title: String?
   @objc dynamic var subtitle: String?
   @objc dynamic var buttonText: String?
   @objc dynamic var buttonShow: Bool = false
   @objc dynamic var buttonUrl: String?
   var items: [GetOldDistrSrvMenuItem]?

   override class func primaryKey() -> String? {
      return "_id"
   }
}

class GetOldDistrSrvMenuItem: Object {
   @objc dynamic var thumbnailUrl: String?
   @objc dynamic var name: String?
   @objc dynamic var sourceUrl: String?
}

为什么 obj 数组中缺少它?我完全糊涂了,不知道怎么了。

【问题讨论】:

  • 你有没有初始化过数组?
  • 是的,它在 GetOldDistrSrvMenu 对象中,在 var items: []
  • 你声明了数组但是你没有初始化它

标签: swift oop


【解决方案1】:

你没有初始化数组。

可选数组意味着它是nil。在 nil 上调用 append(或任何函数)不会做任何事情。

您必须在某个时候将数组初始化为空数组。

obj.items = []


我强烈建议不要使用可选数组,而是始终默认为非可选空数组。

[]nil 数组之间存在差异的情况很少。

你可以var items: [GetOldDistrSrvMenuItem] = []

【讨论】:

  • 完全是我的错!一直以来,我认为可选数组可以立即按项目附加。感谢您的帮助。
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多