J'essaie d'écrire une fonction d'assistance qui va convertir un tableau d'index binaires en une classe conforme à OptionSet.Conversion d'un tableau d'index binaires en OptionSet
func getOptionSet<T: OptionSet>(bitIndexes: [Int64]) -> T {
var result: Int64 = 0
for index in bitIndexes {
result |= 1 << index
}
return T(rawValue: result) // error
}
Cela ne peut pas compiler:
Cannot invoke initializer for type 'T' with an argument list of type '(rawValue: Int64)'
J'ai aussi essayé d'utiliser rawvalue:
func getOptionSet<T: OptionSet>(bitIndexes: [T.RawValue]) {
var result = T.RawValue() // error
Cela ne fonctionne pas aussi bien:
Cannot invoke value of type 'T.RawValue.Type' with argument list '()'
peut cela doit être fait? Ai-je besoin d'ajouter des contraintes supplémentaires sur T?
Je sais qu'il est possible de réécrire cette fonction pour utiliser un type concret, mais je veux le garder générique si possible.
Merci, c'est très utile. Cela vaut-il la peine de tout diffuser sur UIntMax pour les plateformes 32 bits ou est-ce un problème? laisse le résultat: UIntMax = bitIndexes.reduce (UIntMax (0)) {UIntMax ($ 0) | UIntMax (1) << UIntMax ($ 1)} – Zmey
@Zmey: Le type OptionSet peut avoir une RawValue 64 bits même sur des plates-formes 32 bits. Si la valeur intermédiaire est de 32 bits seulement, vous perdez des bits. Mais vous n'avez pas besoin de 'UIntMax ($ 0)' ou 'UIntMax (1)', ces types sont déduits automatiquement. - En fait, j'ai fait ce mal entre les deux, comme vous pouvez le voir dans l'historique des modifications. Cela devrait être correct maintenant. –
@Zmey: Le résultat/accumulateur intermédiaire peut également avoir le type RawValue. Le problème est que l'opérateur '' 'de gauche '' n'est pas défini dans le protocole (Un) SignedInteger, donc vous devrez définir des extensions de protocole supplémentaires pour tous les types bruts possibles, ce que j'ai essayé d'éviter. - Dans la révision 1 de cette réponse, j'ai résolu cela par multiplication au lieu de gauche. Donc c'est possible, mais j'ai trouvé ce code plus élégant. –