Swift:创建UIImage数组

40

我正在使用Swift尝试创建一个UIImage对象的数组,用于简单的动画。 animationImages 的上下文帮助显示“数组必须包含UIImage对象。”

我尝试按以下方式创建该数组,但似乎无法获得正确的语法:

var logoImages: UIImage[]
logoImages[0] = UIImage(name: "logo.png")

这会引发错误:

!变量logoImages在初始化之前使用

然后我尝试了

var logoImages = []
logoImages[0] = UIImage(named: "logo.png")

哪些抛出错误: !无法将此表达式的结果赋值

我已经检查了这里的文档,但上下文不同: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

3个回答

92

你有两个问题(而且不需要使用正则表达式!)

1. 你没有创建一个数组。你需要这样做:

var logoImages: [UIImage] = []
或者
var logoImages: Array<UIImage> = []
或者
var logoImages = [UIImage]()
或者
var logoImages = Array<UIImage>()

2. 如果您想向数组中添加新对象,应使用 Array.append() 或一些等效的语法糖:

logoImages.append(UIImage(named: "logo.png")!)
或者
logoImages += [UIImage(named: "logo.png")!]
或者
logoImages += [UIImage(named: "logo.png")!, UIImage(named: "logo2.png")!]

根据文档(摘自这里), 你需要向数组添加元素,因为你不能使用下标语法将新项附加到数组的末尾。如果您尝试使用下标语法检索或设置超出数组现有边界的索引的值,则会触发运行时错误。但是,您可以通过将其与数组的count属性进行比较来检查索引是否有效,除非count为0(表示数组为空),否则数组中最大的有效索引始终为count-1,因为数组从零开始索引。

当然,在可能的情况下,您总是可以简化它:

var logoImage: [UIImage] = [
    UIImage(named: "logo1.png")!,
    UIImage(named: "logo2.png")!
]

编辑:请注意,UIImage现在有一个“可失败”初始化器,这意味着它返回一个可选项。我已经更新了所有代码片段以反映这个变化以及数组语法的变化。


因此,如ackStOverflow的回复所述,UIImage[]()会抛出一个“一行上的构造语句必须用';'分隔”的错误。而且,这些()括号看起来很像函数调用。还有这个看起来有点奇怪,是吧?UIImage[];()。最后,为什么我必须使用append;为什么不能只将值分配给索引? - kmiklas
由于某些原因,您现在使用的简化方式不再起作用。 - John Riselvato
1
@JohnRiselvato UIImage现在是一个可失败的初始化器(意味着它返回一个可选项)- 将更新答案。 - Jiaaro
@Jiaaro 当您尝试运行此代码时,它会出现错误代码 coder: ObjectiveC.NScoder 导致程序崩溃。 - Marcello B.
现在没有addObject方法了吗? - Supertecnoboff
显示剩余2条评论

2

您正在声明 logoImages 的类型,但没有创建该类型的实例。

请使用 var logoImages = UIImage[]() 来为您创建一个新的数组。

...然后在创建一个新的空数组实例之后,如 @Jiaaro 的答案所述,您不能使用下标添加到一个空数组中。


首先,这会抛出一个错误:“一行上的构造语句必须用';'分隔。Xcode想要UIImage[];() - kmiklas
其次,我看到了这个,但是那两个括号 () 让我害怕,因为它们看起来像函数调用。 - kmiklas
@kmiklas 看起来你遇到了其他问题。ackSt 给出的代码是正确的,不应该引起错误。在你所在的位置放置一个分号会完全改变代码的含义。 - David Berry
@kmiklas 确保您使用 var logoImages = UIImage[]() 来创建用于存储UIImage对象的新数组,然后将其分配给logoImages变量(从赋值中推断变量类型)... 听起来您 可能 不正确地使用分号代替等号? 即 var logoImages:UIImage[]() 这将生成您在评论中描述的错误类型。 - fqdn
说实话,我没有其他事情要做。这是函数中的第一行,Jiaaro下面的第一个语法选项有效:var logoImages:UIImage[] = [] - kmiklas
1
此外,这两个括号实际上是一个函数调用 :) 它们在调用Array上的init()方法,就像你为任何其他结构或类所做的那样。 - fqdn

1
var image : UIImage = UIImage(named:"logo.png")    
var logoImages = [image]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接