我正在學習 Swift 和一些 iOS 開發。這是我的代碼,我試圖找出 XCode 抱怨的原因。
private func rollMyDice() {
let diceRollImages = [
UIImage(named: "DiceOne"),
UIImage(named: "DiceTwo"),
UIImage(named: "DiceThree"),
UIImage(named: "DiceFour"),
UIImage(named: "DiceFive"),
UIImage(named: "DiceSix")
]
diceOneImageView.image = diceRollImages.randomElement()
diceTwoImageView.image = diceRollImages.randomElement()
}
所以在這種情況下,diceOneImageView.image = diceRollImages.randomElement()會抱怨它不能分配UIImage??給UIImage?.
ImageView.image是型別UIImage?。我不明白的是為什么randomElement()這里正在回傳UIImage??。
是什么UIImage??意思?我認為??是 nil 合并運算子,所以我不確定為什么它是某些回傳型別的一部分。
還閱讀有關檔案randomElement(),它應該回傳?。所以在這種情況下,我希望diceRollImages.randomElement()回傳UIImage?應該適合diceOneImageView.image的。
這里發生了什么?我知道我可以通過使用!或使用 nil 合并等來修復它以使其作業。只是不明白發生了什么。
uj5u.com熱心網友回復:
請注意,這UIImage(named:)是一個可失敗的初始化程式,因此運算式UIImage(named: "DiceOne")etc 的型別為UIImage?. 這使得陣列diceRollImages型別為[UIImage?]。每個Element陣列都是UIImage?,或者寫成Optional<UIImage>。
如您所知,Optional它只是一個有兩種情況的列舉,.some和.none(aka nil)。陣列的每個元素可以是:
.some(image), 如果 aUIImage是從名字成功創建的.none, 如果沒有具有該名稱的影像
randomElement被宣告為 return Element?( Optional<Element>),因為陣列可能沒有元素,因此不能給你一個隨機元素。randomElement回傳:
.none, 當陣列為空時.some(elementOfTheArray),當陣列非空并且elementOfTheArray是陣列中的隨機元素時。
回想一下,Element在Optional<UIImage>的情況下diceRollImages,陣列元素 ( elementOfTheArray) 可能有值.some(image)或.none。
因此,我們可以說它randomElement回傳一個 type 的值Optional<Optional<UIImage>>,aka UIImage??,它可能是以下三件事之一:
.none當陣列為空時.some(.some(image))當陣列非空且隨機選擇陣列中創建成功的影像時.some(.none)當陣列非空且隨機選擇陣列中未成功創建的影像時
由于您正在對影像陣列進行硬編碼,因此您知道該陣列不是空的,因此強制展開可選的外層是安全的:
diceOneImageView.image = diceRollImages.randomElement()!
uj5u.com熱心網友回復:
答案已經在評論中給出:UIImage(named:)returns (optional) UIImage?and the result of call randomElement()on an optional is a double optional??
這是一個很好的例子,歡迎強制展開。
影像是應用程式包的一部分,在運行時是不可變的,如果其中一個丟失,應用程式將毫無用處。
宣布diceRollImages
let diceRollImages = [
UIImage(named: "DiceOne")!,
UIImage(named: "DiceTwo")!,
UIImage(named: "DiceThree")!,
UIImage(named: "DiceFour")!,
UIImage(named: "DiceFive")!,
UIImage(named: "DiceSix")!
]
如果代碼仍然崩潰,它會顯示一個可以立即修復的設計錯誤。
您甚至可以強制展開randomElement()!,因為陣列是一個常量并且顯然不是空的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480817.html
上一篇:UITextView富文本編輯
