Я пытаюсь преобразовать существующую программу, которая использует список предопределенных цветов от Ojective-C до Swift. Оригинальный код, используемый селектор для извлечения UIColor на его основе именем представлена в виде NSStringКак преобразовать строку в UIColor в 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);
}
Однако я не смог работать, как для достижения той же функциональности с помощью Swift 3.0, или с использованием селектора даже лучшая техника.
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!)
Ошибка:! Нет «выполнить» кандидаты производят ожидаемого тип контекстной результаты «UIColor»
Это хороший ответ, я просто конвертируются мой код, чтобы проверить это. Однако тот факт, что дублирование названий цветов делает его более громоздким в моем коде, чем другие предложения, так как у меня 230 названных цветов. – Steve
Вы имеете в виду дублирование имен цветов с указанием имен перечислений? Я не уверен, что полностью понимаю, что вы подразумеваете под дублированием имен цветов. – JustinM
Да, тот факт, что каждое имя цвета должно появляться дважды внутри перечисления, один раз в исходном случае, а затем снова внутри create. Таким образом, это усложняет ситуацию, когда я хочу добавить новые имена цветов и т. Д. И приводит к появлению большего количества строк кода. Поэтому, используя эти критерии, предложение словаря является самой компактной реализацией. Но, спасибо, это заставило меня рассмотреть все варианты и изучить несколько новых трюков на этом пути. – Steve