2017-02-20 7 views
2

У меня есть представление таблицы, что каждый раз, когда я создаю новую строку, для изменения ее фона создается случайный случай. С помощью этой функции:Как сравнить случайный UIColor с цветами в массиве цветов в swift?

func getRandomColor() -> UIColor{ 
    let red:CGFloat = CGFloat(drand48()) 
    let green:CGFloat = CGFloat(drand48()) 
    let blue:CGFloat = CGFloat(drand48()) 

    return UIColor(red:red, green: green, blue: blue, alpha: 1.0) 
} 

Я хранить цвет в массиве, делая это, я хочу, чтобы избежать равных цветов в моем представлении таблицы. Массив заполняются, когда представление таблицы создаются в табличном cellForRow, как это:

colors.append(category.color as! UIColor) 

категория мой объект.

Проблема в том, когда я закрываю приложение и запускаю его снова. Постоянно сохраняются и начинают беспорядочно создавать одни и те же цвета. Поэтому я пытаюсь сравнить цвета, чтобы создавать цвета, пока они не станут новым цветом. Используя эту функцию:

func validateColor(color: UIColor) -> Bool { 

    let primeiraCor = colors.first! as UIColor 

    if primeiraCor == color { 
     return false 
    } else { 
     return true 
    } 
} 

Цвет - это мой массив цветов и цвет цвета, который я хочу сравнить. Но каждый раз, когда функция называется, она возвращает true.

Что я могу сделать?

+0

Вы всегда сравниваете с первым элементом вашего цветового массива - вам нужно будет перебирать все цвета, чтобы увидеть, есть ли у вас дубликат. –

+0

Итак, у вас есть [Цвета] с 10 элементами UIColor, и когда вы создаете случайный цвет, вам нужно проверить, имеет ли случайный массив цветов тот же самый элемент, что и исходный массив цветов. Если он имеет одинаковые элементы, вам нужно опустить этот массив элементы и создать новый элемент – Koushik

ответ

1

Во-первых, вы всегда будете получать одинаковые цвета при каждом прогоне, потому что drand48() генерирует одну и ту же последовательность чисел, если вы не засеваете ее. См this answer о том, как сделать это, но вот код, используя текущее время для рандомизации семян:

let time = UInt32(NSDate().timeIntervalSinceReferenceDate) 
srand48(Int(time)) 
let number = drand48() 

Во-вторых - вы сравниваете совершенно случайный цвет (фактически число между 0 и почти 17,000,000) и интересно, почему он никогда не соответствует первому цвету в вашем цветовом массиве? Я думаю, вы должны быть удивлены, если он когда-либо соответствует :-)

+0

Даже зная, что в какой-то день цвет может повториться, это устранило мою проблему. Благодарю. –

2

это можно сделать проще:

func validateColor(color: UIColor) -> Bool { 
    return !colors.contains(color) 
} 

или если вы хотите добавить некоторый порог равенства, то вы могли бы сделать что-то вроде этого: расширение берется из Extract RGB Values From UIColor

extension UIColor { 
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? { 
     var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 
     return getRed(&r, green: &g, blue: &b, alpha: &a) ? (r,g,b,a) : nil 
    } 
} 


func validateColor(color: UIColor) -> Bool { 
    let maxDistance: CGFloat = 0.3 
    guard let colorComponents = color.components else { 
     return true 
    } 
    return !colors.contains { c in 
     guard let components = c.components else { 
      return false 
     } 

     let distance = abs(colorComponents.red - components.red) + abs(colorComponents.green - components.green) + abs(colorComponents.blue - components.blue) 

     return distance < maxDistance 
    } 
} 

Установите порог в maxDistance переменной или переместить его в статический член вашего класса для лучшей читаемости.

+0

содержит не работает. Я уже пробовал. Но спасибо, когда у меня есть время, я проверю другой путь. Благодарю. –

Смежные вопросы