繁体   English   中英

Int&#39;不能转换为&#39;Range <Int>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM