我正在尝试创建一个包含四个图像的字典,将其中一个设置为UIView
的背景。选择的图像取决于rand
数字的值。
以下是创建字典的代码:
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])
为什么会这样?
答案 0 :(得分:2)
有两个类似的问题:
UIImage
初始化程序是可用的,因此它返回一个可选的有两种方法可以解决它:
强行展开图像两次:
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]!)
虽然我通常建议使用可选绑定来防止运行时异常,但我认为在这种情况下图像必须存在,如果它们不是,那就是开发错误(即无法将图像添加到该项目或错误输入他们的名字) - 所以例外是一个很好的解决方法。
答案 1 :(得分: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)
}
}
答案 2 :(得分:0)
字典在swift中返回选项以处理不存在的键的情况。在分配给变量if let image = backgroundDict[backgroundArray[randNumber]]
之前,使用backgroundArray[randNumber]
确保密钥image
有相应的UIImage。
使用条件中的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!)
}