[英]Int' is not convertible to 'Range<Int>
我正在尝试创建一个包含四个图像的字典,以将其中一个设置为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])
为什么会这样呢?
有两个类似的问题:
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]!)
尽管我通常建议使用可选绑定来防止运行时异常,但我认为在这种情况下图像必须存在,如果不存在,则是开发错误(即无法将图像添加到项目中或错误地命名其名称) -因此,例外是解决此问题的好方法。
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)
}
}
字典会迅速返回可选内容,以处理不存在的键的情况。 使用if let image = backgroundDict[backgroundArray[randNumber]]
可以确保在分配给变量image
之前,键backgroundArray[randNumber]
有对应的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!)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.