Синтаксис Swift 4 для добавления нескольких объектов, с некоторыми установленными свойствами, в массив? - PullRequest
0 голосов
/ 27 января 2019

Существует ли некоторый сокращенный синтаксис, который позволит мне добавить объект с его свойствами, установленными в массив.Это то, чем я сейчас занимаюсь, однако я хотел бы добавить все эти объекты в одном операторе добавления.

Я пробовал различный синтаксис, используя 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 Framework.

@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 ву этого класса и у меня есть несколько вспомогательных методов, в которых я хотел бы использовать один и тот же синтаксический подход.

Ответы [ 4 ]

0 голосов
/ 27 января 2019

Для этого вы можете добавить метод, который обновляет объект и возвращает себя.Давайте назовем это 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) })
]
0 голосов
/ 27 января 2019

Я бы хотел добавить все эти объекты в один оператор добавления.

Вы можете сделать это так:

selectFields = [tid, name]

Но так как ваш источник данных selectFields уже инициализирован, это будет хорошо:

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

0 голосов
/ 27 января 2019

Добавьте инициализатор в структуру или класс iCloudSchemaFieldValue, который принимает тип LoggerStartup.eTblTypes, и установите соответствующее свойство в методе init

init(field: LoggerStartup.eTblTypes)

Тогда вы можете написать

var selectFields = [iCloudSchemaFieldValue]()

selectFields = [iCloudSchemaFieldValue(field: .tid), 
                iCloudSchemaFieldValue(field: .name)]
0 голосов
/ 27 января 2019

Не знаю, намного ли это лучше, но вы могли бы сделать что-то вроде:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...