Swift 4 快捷语法将多个对象(设置了一些属性)添加到数组中?
Posted
技术标签:
【中文标题】Swift 4 快捷语法将多个对象(设置了一些属性)添加到数组中?【英文标题】:Swift 4 shortcut syntax to add multiple objects, with some properities set, to an array? 【发布时间】:2019-01-27 11:14:48 【问题描述】:是否有一些速记语法可以让我添加一个对象并将其属性设置为数组。这是我目前正在做的事情,但是我想将这些对象全部附加到一个附加语句中。
我尝试了各种语法,使用self()
,但运气不佳。
var selectFields = [iCloudSchemaFieldValue]()
let tid = iCloudSchemaFieldValue()
tid.setField(LoggerStartup.eTblTypes.tid)
selectFields.append(tid)
let name = iCloudSchemaFieldValue()
name.setField(LoggerStartup.eTblTypes.name)
selectFields.append(name)
这是我的枚举
public enum eTblTypes
public static let tid = 2010
public static let name = 2020
//
这是我的 Objective C 框架类..
@interface iCloudSchemaFieldValue : NSObject
@property (nonatomic) NSInteger enumVal;
@property (nonatomic) NSInteger tableEnumVal;
@property (nonatomic) id value;
@property (nonatomic) BOOL sysGenDefault;
@property (nonatomic) eOperator whereOperator;
@property (nonatomic) eOperator whereCondition;
@property (nonatomic) NSInteger padAmount;
-(id)setField: (NSInteger)ev;
-(id)setFieldVal: (NSInteger)ev
value: (id)value;
-(id)setFieldWithPadding: (NSInteger)ev
padding: (NSInteger)padding;
-(id)setFieldSysGenVal: (NSInteger)ev;
-(id)setWhereVal: (NSInteger)ev
table: (NSInteger)tableEv
operator: (eOperator)op
value: (id)value
condition: (eOperator)condition;
@end
我真的不想在这个类中添加一个 init 方法,我有几个帮助方法,我想使用相同的速记语法方法。
【问题讨论】:
你能告诉我们setField
方法吗?
来自我的 Objective C 框架-(id)setField: (NSInteger)ev;
这是否意味着您不能修改iCloudSchemeFieldValue
类?
【参考方案1】:
我不知道这是否更好,但你可以这样做:
let selectFields: [iCloudSchemaFieldValue] = [
LoggerStartup.eTblTypes.tid,
LoggerStartup.eTblTypes.name,
... // add other fields you want to set here
].map
let obj = iCloudSchemaFieldValue()
obj.setField($0)
return obj
我假设LoggerStartup.eTblTypes.tid
和LoggerStartup.eTblTypes.name
属于同一类型Int
,而iCloudSchemaFieldValue
是一个类型。
现在您只需再添加一行,而不是 3 行,每次您想设置一个新字段。
如果您可以编辑 iCloudSchemaFieldValue
以添加一个采用 Int
的初始化程序,那将是最好的。然后你可以这样做:
let selectFields = [
LoggerStartup.eTblTypes.tid,
LoggerStartup.eTblTypes.name,
... // add other fields you want to set here
].map(iCloudSchemaFieldValue.init)
【讨论】:
@JulessetValue
接受 Int
参数对吗? LoggerStartup.eTblTypes.tid
的类型是什么?
@Jules 哦等等!你打电话给setValue
。你应该打电话给setField
!【参考方案2】:
在 iCloudSchemaFieldValue
结构或类中添加一个初始化器,它采用 LoggerStartup.eTblTypes
类型并在 init 方法中设置适当的属性
init(field: LoggerStartup.eTblTypes)
那你就可以写了
var selectFields = [iCloudSchemaFieldValue]()
selectFields = [iCloudSchemaFieldValue(field: .tid),
iCloudSchemaFieldValue(field: .name)]
【讨论】:
对不起,我实际上有几种方法可以做不同的事情,所以如果可能的话,我想对这些使用相同的方法。 在问题中详细说明您的问题!【参考方案3】:为此,您可以添加更新对象并返回自身的方法。
我们就叫它updating
吧。
extension iCloudSchemaFieldValue
func updating(with closure: (iCloudSchemaFieldValue) -> Void) -> iCloudSchemaFieldValue
closure(self)
return self
所以你的代码将如下所示:
let selectFields = [
iCloudSchemaFieldValue().updating(with: $0.setField(LoggerStartup.eTblTypes.tid) ),
iCloudSchemaFieldValue().updating(with: $0.setField(LoggerStartup.eTblTypes.name) )
]
【讨论】:
【参考方案4】:我想将这些对象全部附加到一个附加语句中。
你可以这样做:
selectFields = [tid, name]
但是由于您的数据源selectFields
已经被初始化,这样就可以了:
selectFields.insert(contentsOf: [tid, name], at: 0)
【讨论】:
以上是关于Swift 4 快捷语法将多个对象(设置了一些属性)添加到数组中?的主要内容,如果未能解决你的问题,请参考以下文章