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