Swift 4 快捷语法,用于将多个对象添加到数组中,并设置了一些属性



是否有一些速记语法可以让我添加一个对象,并将其属性设置为数组。这就是我目前正在做的事情,但是我想将这些对象全部附加到一个 append 语句中。

我尝试了各种语法,使用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
    //
}

这是我的目标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 方法,我有几个帮助程序方法,我想使用相同的简写语法方法。

我不知道

这是否更好,但你可以做这样的事情:

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.tidLoggerStartup.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)

iCloudSchemaFieldValue 结构或类中添加一个初始值设定项,该初始值设定项采用LoggerStartup.eTblTypes类型并在 init 方法中设置适当的属性

init(field: LoggerStartup.eTblTypes)

然后你可以写

var selectFields = [iCloudSchemaFieldValue]()
selectFields = [iCloudSchemaFieldValue(field: .tid), 
                iCloudSchemaFieldValue(field: .name)]

为此,您可以添加更新对象并返回自身的方法。我们称之为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) })
]

我想将这些对象全部附加到一个附加语句中。

你可以这样做:

selectFields = [tid, name]

但是由于您的数据源selectFields已经初始化,因此这很好:

selectFields.insert(contentsOf: [tid, name], at: 0)

相关内容

  • 没有找到相关文章

最新更新