2015-03-03 6 views
0

Я пытаюсь создать словарь, содержащий четыре изображения, чтобы установить один из них в качестве фона UIView. Выбранное изображение будет зависеть от значения rand.Int 'не конвертируется в' Диапазон <Int>

Вот код, который создает словарь:

let backgroundDict = [ 
     "Clouds": UIImage(named: "clouds.jpg"), 
     "Clouds2": UIImage(named: "clouds2.jpg"), 
     "Sunset": UIImage(named: "sunset.jpg"), 
     "Sunset2": UIImage(named: "sunset2.jpg") 
    ] 

Вот как я создаю rand номер:

var randNumber = Int(arc4random_uniform(UInt32(backgroundDict.count))) 

Это код, который объявляет массив с ключами словаря:

let backgroundArray = Array(backgroundDict.keys) 

Я получаю ошибку 'Int' is not convertible to 'Range<Int> когда я пытаюсь для установки фонового изображения:

self.view.backgroundColor = UIColor(patternImage: backgroundDict[backgroundArray[randNumber] as String]) 

Почему это происходит?

ответ

2

Есть 2 схожие проблемы:

  • UIImage инициализатор failable, поэтому он возвращает дополнительный
  • словарь всегда возвращает необязательный при доступе к элементу по ключевым

Есть 2 способа исправить это:

  • сила разворачивая изображение дважды:

    UIColor(patternImage: backgroundDict[backgroundArray[randNumber] as String]!!) 
                          ^^ 
    
  • силы разворачивают изображений при создании словаря:

    let backgroundDict = [ 
        "Clouds": UIImage(named: "clouds.jpg")!, 
        "Clouds2": UIImage(named: "clouds2.jpg")!, 
        "Sunset": UIImage(named: "sunset.jpg")!, 
        "Sunset2": UIImage(named: "sunset2.jpg")! 
    ] 
    

    затем использовать единую силу развертку при доступе к словарю по значению:

    UIColor(patternImage: backgroundDict[backgroundArray[randNumber] as String]!) 
    

Хотя я обычно рекомендую использовать необязательное связывание для предотвращения исключений во время выполнения, я полагаю, что в этом c ase изображения должны существовать, и если они этого не делают, это ошибка развития (т. неспособность добавить изображения в проект или опечатать их имена), поэтому исключение - отличный способ понять это.

+0

Это сработало! Большое спасибо Антонио! – David

1

UIImage(named: "") является необязательным инициализатором init? и UIColor(patternImage: ...) занимает UIImage, поэтому вам необходимо развернуть свои изображения перед их использованием. Кроме того, необходимо разворачивать возвращаемое значение из словаря:

//In Swift 1.2 
if let optionalImage = backgroundDict[backgroundArray[randNumber] as String], image = optionalImage { 
     UIImage(patternImage: image) 
} 

//In Swift 1.1 
if let optionalImage = backgroundDict[backgroundArray[randNumber] as String] { 
    if let image = optionalImage { 
     UIImage(patternImage: image) 
    } 
} 
+1

Я бы прямо сказал, что для вашего решения требуется быстрое 1.2 – Antonio

0

Словари вернуться в стрижа УСТРОЙСТВА обрабатывать случай несуществующих ключей. Используя if let image = backgroundDict[backgroundArray[randNumber]], убедитесь, что перед назначением переменной image есть соответствующий UIImage для ключа backgroundArray[randNumber].

image! (необязательно разворачивается) внутри условного используется, потому что image имеет тип UIImage? (это приведет к ошибке, если оно равно нулю).Инициализация UIImage по имени возвращает необязательный вариант для обработки случая отсутствия изображения с указанным именем.

let backgroundDict = [ 
      "Clouds": UIImage(named: "clouds.jpg"), 
      "Clouds2": UIImage(named: "clouds2.jpg"), 
      "Sunset": UIImage(named: "sunset.jpg"), 
      "Sunset2": UIImage(named: "sunset2.jpg") 
     ] 

     var randNumber = Int(arc4random_uniform(UInt32(backgroundDict.count))) 
     let backgroundArray = Array(backgroundDict.keys) 

     if let image = backgroundDict[backgroundArray[randNumber]] { 
      self.view.backgroundColor = UIColor(patternImage: image!) 
     } 
Смежные вопросы