Existe-t-il une syntaxe abrégée qui me permettra d'ajouter un objet avec ses propriétés définies sur un tableau. C'est ce que je fais actuellement, mais j'aimerais ajouter ces objets dans une seule instruction append.

J'ai essayé différentes syntaxes, en utilisant self() mais je n'ai pas eu beaucoup de chance.

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)

Voici mon énumération

public enum eTblTypes
{
    public static let tid              = 2010
    public static let name             = 2020
    //
}

Voici ma classe de cadre 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

Je ne veux vraiment pas ajouter de méthode init à cette classe et j'ai plusieurs méthodes d'aide où j'aimerais utiliser la même approche syntaxique courte.

1
Jules 27 janv. 2019 à 14:14

4 réponses

Meilleure réponse

Je ne sais pas si c'est beaucoup mieux, mais vous pouvez faire quelque chose comme:

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
}

J'ai supposé que LoggerStartup.eTblTypes.tid et LoggerStartup.eTblTypes.name sont du même type Int, et que iCloudSchemaFieldValue est un type.

Il ne vous reste plus qu'à ajouter une ligne supplémentaire, au lieu de 3, chaque fois que vous souhaitez définir un nouveau champ.

Il serait préférable que vous puissiez modifier iCloudSchemaFieldValue pour ajouter un initialiseur prenant un Int. Et puis vous pourriez faire:

let selectFields = [
    LoggerStartup.eTblTypes.tid,
    LoggerStartup.eTblTypes.name,
    ... // add other fields you want to set here
].map(iCloudSchemaFieldValue.init)
1
Sweeper 27 janv. 2019 à 11:45

Pour cela, vous pouvez ajouter une méthode qui met à jour l'objet et se renvoie elle-même. Appelons-le updating.

extension iCloudSchemaFieldValue {
    func updating(with closure: (iCloudSchemaFieldValue) -> Void) -> iCloudSchemaFieldValue {
        closure(self)
        return self
    }
}

Ainsi, votre code ressemblera à ceci:

let selectFields = [
    iCloudSchemaFieldValue().updating(with: { $0.setField(LoggerStartup.eTblTypes.tid) }),
    iCloudSchemaFieldValue().updating(with: { $0.setField(LoggerStartup.eTblTypes.name) })
]
1
Sviatoslav Yakymiv 27 janv. 2019 à 11:43

Je voudrais ajouter ces objets dans une seule instruction append.

Vous pouvez le faire comme ceci:

selectFields = [tid, name]

Mais comme votre source de données selectFields a déjà été initialisée, ce serait bien:

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

0
Glenn 27 janv. 2019 à 11:24

Ajoutez un initialiseur dans la structure ou la classe iCloudSchemaFieldValue qui prend un type LoggerStartup.eTblTypes et définissez la propriété appropriée dans la méthode init

init(field: LoggerStartup.eTblTypes)

Ensuite, vous pouvez écrire

var selectFields = [iCloudSchemaFieldValue]()

selectFields = [iCloudSchemaFieldValue(field: .tid), 
                iCloudSchemaFieldValue(field: .name)]
1
vadian 27 janv. 2019 à 11:27