2016-01-06 4 views
0

Я создал массив UIImagesViews, и я сделал код, чтобы назначить им случайные снимки. Я хотел бы сделать if-statement, если более или 5 изображений имеют одинаковое изображение.If-statements с UIImageViews

var images: [UIImageView] = [Image1, Image2, Image3, Image4, Image5, Image6, Image7, Image8, Image9] 

Различные фотографии названы card1, card2, card3

let firstRandomNumber = arc4random_uniform(3) + 1 
    let firstRandomString:String = String(format: "card%i", firstRandomNumber) 

    self.Image1.image = UIImage(named: firstRandomString) 

    let secondRandomNumber = arc4random_uniform(3) + 1 
    let secondRandomString:String = String(format: "card%i", secondRandomNumber) 

    self.Image2.image = UIImage(named: secondRandomString) 

Все изображения имеют свой специфический код, как те выше. Теперь, как я сказал, я хотел бы сделать if -statement или switch -case, если пять или более изображений имеют одинаковое изображение.

Редактировать: Вот обновленный код;

let imageNames:NSArray = [firstRandomString, secondRandomString, thirdRandomString, fourthRandomString, fifthRandomString, sixthRandomString, seventhRandomString, eighthRandomString, ninthRandomString] 

    let maxRepeating = imageNames 
     .map {img in imageNames.reduce(0) { $1 == img ? $0 + 1 : $0} } 
     .reduce(0){ $1 > $0 ? $1 : $0 } 

В код только одна ошибка: .map {img in imageNames.reduce(0) { $1 == img ? $0 + 1 : $0} };

бинарный оператор «==» не может быть применен к двум «Element» (так называемый «AnyObject») операнды

Edit: Вот еще один код, который я пытался от Кристофера Кевина;

var correct = 0 

func checkImageDuplication() { 
     let imageArray : NSArray = [firstRandomString, secondRandomString, thirdRandomString, fourthRandomString, fifthRandomString, sixthRandomString, seventhRandomString, eighthRandomString, ninthRandomString] 
     let imageDataArray = imageArray.map { (image) -> NSData in 
      return UIImagePNGRepresentation(image as! UIImage)! 
     } 

     let countSet = NSCountedSet(array: imageDataArray) 
     for imageData in imageDataArray { 
      let count = countSet.countForObject(imageData) 
      if count > 5 { 
       correct = 5 
      } 
     } 
    } 

@IBAction func PlayerPRESSED(sender: AnyObject) { 
    if correct == 5 { 
     view.backgroundColor = UIColor.greenColor() 
    } 
} 

Я пробовал код, но он не будет выполнять действие. (view.backgroundColor) У кого-нибудь есть идея, что не так с этим кодом?

+0

показать ваш код. что вы пробовали до сих пор? – Wain

+0

напишите свой случайный код, пожалуйста – Khuong

+0

@Wain Я ничего не смог понять, понял что-то вроде 'if images == card1 && card1' - 5 раз, но это было совершенно глупо ... –

ответ

0

Ваша логика здесь должна быть отделена от представлений.

Создайте модель в том же классе, который содержит массив UIImage. Используйте этот массив для заполнения ваших карточек и для проверки того, является ли более 5 изображений одинаковыми. Пример тестировался и unoptimised код:

var images = [UIImage]() 

private func populateImages() { 
    // Fill images array, and perhaps populate imageViews 
} 

private func checkImageDuplication() { 
    let imageDataArray = imageArray.map { (image) -> NSData in 
    return UIImagePNGRepresentation(image)! 
    } 

    let countSet = NSCountedSet(array: imageDataArray) 
    for imageData in imageDataArray { 
     let count = countSet.countForObject(imageData) 
     if count > 5 { 
      // Handle here 
     } 
    } 
} 
+0

Кажется, отличный ответ, но что и какой фильтр Swift можно использовать и как? :) –

+0

Оглядываясь назад, модель 'UIImage' может усложнить ситуацию, просто потому, что их нельзя легко сравнить, не превращая их в чистые представления NSData. Если ваша модель была вместо массива String (типы значений, поэтому их можно сравнивать напрямую), вы можете использовать 'NSCountedSet', чтобы получить все подсчеты. Просто добавьте в NSCountedSet строку имени изображения в функции 'populateImages()', а затем повторите все подсчеты в 'checkImageDuplication()'. –

+0

Это означает, что я должен сделать другое имя строки для всех 9 изображений со всеми тремя различными типами изображений? –

0

Я не думаю, что вы можете сравнить UIImage объекты, так как каждый вызов UIImage(named:) будет генерировать другой UIImage экземпляр, даже если имя совпадает. Я бы рекомендовал создавать массив строк и тестировать этот массив для повторений, например:

let maxRepeating = imageNames 
    .map {img in imageNames.reduce(0) { $1 == img ? $0 + 1 : $0} } 
    .reduce(0){ $1 > $0 ? $1 : $0 } 
+0

Как создать эти строки? (imageNames?) - или я должен использовать строки 'Image1'? –

+0

Строки в обсуждении - те, которые были переданы UIImage (named :), – Cristik

+0

Посмотрите на обновленный вопрос и посмотрите, правильно ли я это сделал и как я могу избавиться от ошибки? :) Если да, то вы ответили на вопрос! :) –

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