Swift中UIImageView赋值报错及UIImage与UIImageView区别咨询
编译错误修复
你在rollButtonPressed方法里的核心问题是混淆了控件赋值逻辑、写错了数组取值语法,四个编译错误全部来自这一行错误代码:
// 原错误代码 diceImageView1 = [ UIImageView(imageLiteralResourceName: "DiceOne"),UIImageView(imageLiteralResourceName: "DiceTwo"),UIImageView(imageLiteralResourceName: "DiceThree"),UIImageView(imageLiteralResourceName: "DiceFour"),UIImageView(imageLiteralResourceName: "DiceFive"),UIImageView(imageLiteralResourceName: "DiceSix")],[leftDiceNumber]
对应错误的根因:
- 错误3、4、1:数组下标取值语法写错了,Swift里取数组指定位置元素的写法是
数组名[索引值],你在数组和方括号之间多打了一个逗号,编译器会把逗号前后识别为两段独立语句,才会连续报「语句缺分号分隔」「缺表达式」「传了无效参数」的错。 - 错误2:
diceImageView1是你已经通过IBOutlet连到Storyboard的UIImageView实例,本身已经是渲染在界面上的控件,不需要重新给这个变量赋值新的UIImageView对象;同时你数组里存的是新建的UIImageView实例,但你实际需要更新的是现有控件显示的图片内容,类型完全不匹配。
修正后的方法代码:
@IBAction func rollButtonPressed(_ sender: UIButton) { print("button pressed") // 提前把所有骰子图片存为UIImage数组,不需要重复创建UIImageView let diceImageArray = [ UIImage(imageLiteralResourceName: "DiceOne"), UIImage(imageLiteralResourceName: "DiceTwo"), UIImage(imageLiteralResourceName: "DiceThree"), UIImage(imageLiteralResourceName: "DiceFour"), UIImage(imageLiteralResourceName: "DiceFive"), UIImage(imageLiteralResourceName: "DiceSix") ] // 给现有UIImageView的image属性赋值,注意Swift数组索引从0开始,所以要做-1适配 diceImageView1.image = diceImageArray[leftDiceNumber - 1] // 做边界循环,避免索引超过6触发数组越界崩溃 leftDiceNumber = leftDiceNumber == 6 ? 1 : leftDiceNumber + 1 // 如果需要第二个骰子同步滚动,直接调用随机取值方法即可 // diceImageView2.image = diceImageArray.randomElement() }
UIImageView 与 UIImage 的核心区别和适用场景
- UIImage
属于数据层对象,只承载图片本身的二进制数据、尺寸、缩放比例、渲染方向等内容属性,没有视图层级相关的位置、大小、透明度、交互响应能力,本身不能直接显示在界面上。
适用场景:所有需要处理图片数据本身的场景:比如本地/网络拉取图片后暂存、图片裁剪/压缩/加滤镜等后台处理、给各类UI控件(按钮、图片视图、菜单图标)提供显示内容源。 - UIImageView
属于视图层控件,继承自UIView,拥有完整的视图属性(frame、alpha、圆角、交互开关、内容显示模式),是专门负责把UIImage数据渲染到屏幕上的容器,还支持设置多张UIImage做帧动画。
适用场景:所有需要在界面上展示图片的场景:比如静态图片展示、图片点击交互、连续帧动画、控制图片的填充/缩放规则。
内容的提问来源于stack exchange,提问作者Alexander Porcescu
相关产品推荐
相关产品推荐

