Reputation: 1152
I would like to create a generic function to avoid repeating while using conditions. Is there any possible ideas to achieve this? Thanks
struct ObjectDataItem {
var name: String
var value: String
}
static func arrayFields(arrayObject: ArrayObject) -> Array<ObjectDataItem> {
var objectFields = [ObjectDataItem]()
if let objectCategoryValue = arrayObject.objectCategory {
let data = [ObjectDataItem(name: ObjectCategoryConstant.objectCategoryKey, value: objectCategory)]
objectFields.append(contentsOf: data)
}
if let objectTypeValue = arrayObject.objectType {
let data = [ObjectDataItem(name: ObjectTypeConstant.objectTypeKey, value: objectTypeValue)]
objectFields.append(contentsOf: data)
}
if let objectName = arrayObject.objectName {
let data = [ObjectDataItem(name: ObjectNameConstant.objectNameKey, value: objectName)]
objectFields.append(contentsOf: data)
}
if let countryObjectValue = arrayObject.countryObjectCode {
let data = [ObjectDataItem(name: countryObjectConstant.countryObjectCodeKey, value: countryObjectValue)]
objectFields.append(contentsOf: data)
}
return objectFields
}
Upvotes: 1
Views: 174
Reputation: 5076
You could use keypaths
func arrayFields(arrayObject: ArrayObject) -> Array<ObjectDataItem> {
var objectFields = [ObjectDataItem]()
func appendField(key: String, valuePath: KeyPath<ArrayObject, String?>) {
if let value = arrayObject[keyPath: valuePath] {
let data = [ObjectDataItem(name: key, value: value)]
objectFields.append(contentsOf: data)
}
}
appendField(key: ObjectCategoryConstant.objectCategoryKey, valuePath: \ArrayObject.objectCategory)
appendField(key: ObjectCategoryConstant.objectTypeKey, valuePath: \ArrayObject.objectType)
return objectFields
}
You could go a step further and use a dictionary to lookup the keys, so in the end you would only have to pass in the keypath.
Upvotes: 1
Reputation: 2873
You can also use reflection if you do not mind your keys to be the names of your property names Something like this:
func arrayFields(arrayObject: ArrayObject) -> Array<ObjectDataItem> {
var objectFields = [ObjectDataItem]()
let objectMirror = Mirror(reflecting: arrayObject)
for child in objectMirror.children {
let (propertyName, propertyValue) = child
objectFields.append(ObjectDataItem(name:propertyName!, value: propertyValue as! String))
}
return objectFields
}
Upvotes: 0
Reputation: 130082
The only thing that makes sense to me is to create a dictionary first:
var dataDictionary: [String: String] = [:]
dataDictionary[ObjectCategoryConstant.objectCategoryKey] = arrayObject.objectCategory
dataDictionary[ObjectCategoryConstant.objectTypeKey] = arrayObject.objectType
dataDictionary[ObjectCategoryConstant.objectNameKey] = arrayObject.objectName
dataDictionary[countryObjectConstant.countryObjectCodeKey] = arrayObject.countryObjectValue
let objectFields = dataDictionary.map { (name, value) in
ObjectDataItem(name: name, value: countryObjectValue)
}
Dictionary does not contain values that are nil
. However, you lose the ordering of values (if it's important for you). The simplification is not very big either.
Upvotes: 0