Int'不能转换为'Range <int> </int>

时间:2015-03-03 16:13:47

标签: ios swift

我正在尝试创建一个包含四个图像的字典,将其中一个设置为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])

为什么会这样?

3 个答案:

答案 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!)
        }