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

【讨论】:

@Jules setValue 接受 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 快捷语法将多个对象(设置了一些属性)添加到数组中?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4仅为一个视图控制器设置导航属性

Swift 4仅为一个视图控制器设置导航属性

为实现多个协议的任何对象定义一个 Swift 类型别名

将代码更新为最新的 Swift 4 语法会导致“线程 1:致命错误:索引超出范围”错误

在swift中实现swiftUI中的链式语法

Swift 枚举值不可设置