J'essaie de convertir un programme existant qui utilise une liste de couleurs prédéfinies d'Ojective-C à Swift. Le code original utilisé Selector pour extraire un UIColor basé sur ce nom représenté comme un NSStringComment convertir une chaîne en UIColor dans Swift 3.0?
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
-(UIColor *)getColor:(NSString*)colorName
{
SEL selColor = NSSelectorFromString(colorName);
NSString *errorMessage = [NSString stringWithFormat:@"Invalid color name: %@ !!!", colorName];
NSAssert([UIColor respondsToSelector:selColor] == YES, errorMessage);
UIColor *mycolor = [UIColor performSelector:selColor];
return mycolor;
}
+ (instancetype)turquoiseColor {
return UIColorFromRGB(0x40E0D0);
}
+ (instancetype)mediumTurquoiseColor {
return UIColorFromRGB(0x48D1CC);
}
Cependant, je suis incapable de trouver comment obtenir les mêmes fonctionnalités en utilisant Swift 3.0, ou si l'utilisation du sélecteur est même la meilleure technique.
func UIColorFromRGB(_ rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8)/255.0,
blue: CGFloat(rgbValue & 0x0000FF)/255.0,
alpha: CGFloat(1.0)
)
}
extension UIColor {
public class var turquoise: UIColor { return UIColorFromRGB(0x40E0D0) }
}
extension UIColor {
public class var mediumTurquoise: UIColor { return UIColorFromRGB(0x48D1CC) }
}
let myColor: UIColor = .turquoise
let name: String = "turquoise"
let colorName = "UIColor.\(name)"
let selector: Selector = NSSelectorFromString(colorName)
let colorSelected: UIColor = UIColor.perform(selector!)
Erreur:! Non Perform «Les candidats produisent le type de résultat contextuel prévu « UIColor »
C'est une bonne réponse, je viens converti mon code pour le tester. Cependant, le fait qu'il y ait duplication des noms de couleurs le rend plus encombrant dans mon code que les autres suggestions, puisque j'ai 230 couleurs nommées. – Steve
voulez-vous dire la duplication des noms de couleur avec le nom des cas enum? Je ne suis pas sûr de comprendre totalement ce que vous entendez par duplication de noms de couleurs. – JustinM
Oui, le fait que chaque nom de couleur doit apparaître deux fois dans l'énumération, une fois dans l'instruction initiale, puis à nouveau dans l'instruction create. Donc, cela complique les choses quand je veux ajouter de nouveaux noms de couleurs, etc. et conduit à plus de lignes de code. Donc, en utilisant ces critères, la suggestion du dictionnaire est l'implémentation la plus compacte. Mais merci, ça m'a fait réfléchir à toutes les options, et j'apprends quelques nouvelles astuces sur le chemin. – Steve