在Swift中找不到接受所提供参数的“init”重载。

4

我正在尝试在Swift中翻译这个内容,但是出现了错误:“找不到接受所提供参数的“init”的重载”。非常感谢任何建议。

var pageImages:[UIImage] = [UIImage]()
pageImages = [UIImage(named: "example.png"), UIImage(named: "example2.png")]

1
假设这两个图像都存在,你的代码对我来说运行良好。你确定问题是出在这两行代码上吗? - Daniel T.
@DanielT。那你不是在使用Swift 1.1(Xcode 6.1)。他的代码无法编译。 - matt
3个回答

14

确认Matt所说的:

在xCode 6.0中,这确实可以工作:

images = [UIImage(named: "steps_normal"), UIImage(named: "steps_big")]

但在xCode6.1中,值应该被解包:

images = [UIImage(named: "steps_normal")!, UIImage(named: "steps_big")!]

images = [UIImage(named: "steps_normal") ?? UIImage(), UIImage(named: "steps_big") ?? UIImage()] 因此,如果没有找到图像,应用程序将不会崩溃,确保应用程序稳定运行。 - Eugene Braginets

3

拆开那些可选项。UIImage并不等同于UIImage?,这是named:初始化程序返回的内容。因此:

var pageImages = [UIImage(named: "example.png")!, UIImage(named: "example2.png")!]

(当然,除非您确实需要一个可选 UIImages 数组。)

1
实际上,根据Xcode 6.0文档,它返回一个UIImage,但你说得对,这样的返回值是没有意义的。我认为它实际上返回的是一个隐式展开条件。 - Daniel T.
1
但他正在使用Xcode 6.1(昨天发布,并且之前有一段时间可用的测试版)。我保证,因为我认识他得到的错误信息。如果他没有使用6.1,他的代码将会编译,我们就不会在这里了。init(named:)现在(正确地)返回一个可选项。它不是隐式解包的。这就是为什么他必须解包它的原因。 - matt
看起来我还需要进行一些更新。很高兴听到他们正在改进这个库。 - Daniel T.
@DanielT。他们先把情况搞糟了,所以你很庆幸错过了最初的几个6.1测试版。太可怕了。 - matt

2

UIImage(named:) 在Xcode 6.1中被改为了一个可失败的初始化器,这意味着如果您在包中未找到列表中的任何图像,则它将返回nil。为了安全地加载图像,请尝试像这样做:

var pageImages = [UIImage]()
for name in ["example.png", "example2.png"] {
    if let image = UIImage(named: name) {
        pageImages.append(image)
    }
}

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