簡體   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