Swift 可选数组中缺少数据
Swift data missing in optional array
我对此一头雾水。我将数据附加到一个可选数组,但它就消失了。下面是进一步解释的代码:
问题所在:
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 数组中丢失了?我一头雾水,不知道怎么了。
您没有初始化数组。
一个可选的数组意味着它是一个 nil
。在 nil
上调用 append
(或任何函数)不会执行任何操作。
您必须在某个时候将数组初始化为空数组。
obj.items = []
我强烈建议不要使用可选数组,而是始终默认使用非可选的空数组。
很少有 []
和 nil
数组之间存在差异的情况。
你可以做到 var items: [GetOldDistrSrvMenuItem] = []
我对此一头雾水。我将数据附加到一个可选数组,但它就消失了。下面是进一步解释的代码:
问题所在:
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 数组中丢失了?我一头雾水,不知道怎么了。
您没有初始化数组。
一个可选的数组意味着它是一个 nil
。在 nil
上调用 append
(或任何函数)不会执行任何操作。
您必须在某个时候将数组初始化为空数组。
obj.items = []
我强烈建议不要使用可选数组,而是始终默认使用非可选的空数组。
很少有 []
和 nil
数组之间存在差异的情况。
你可以做到 var items: [GetOldDistrSrvMenuItem] = []