"没有更多的上下文,表达式类型是不明确的",使用一个数组。

3

我正在使用 xCode 7.3 的 playground 并学习 Swift 2.0。

我有一个如下的数组:

var arrayName:Array = [1, 2, 3, 4, "Mike"]

我遇到了以下错误:

表达式类型不明确,需要更多的上下文信息

当我从数组中移除字符串时,错误消失了。但是显然Swift允许在数组中使用多种类型,所以我不明白为什么会出错?
你有什么想法吗?
谢谢!

问题是因为我没有导入UIKit。 - Gixxy22
3个回答

3

错误信息已经说明了问题。例如,您可以像这样解决它:

var arrayName: Array<AnyObject> = [1, 2, 3, 4, "Mike"]

或者,更简单地说,
var arrayName = [1, 2, 3, 4, "Mike"]

那么arrayName将会隐式地获得类型为Array<NSObject>

关键在于类型识别。您有两个选择:使用显式的完整类型声明,或让Swift编译器尝试识别类型。


我明白了,谢谢。虽然你的第一个例子出现了错误:类型“Int”的值不符合预期的元素类型“AnyObject”。 - Gixxy22
你的第二个例子仍然给我显示了最初的错误信息。 - Gixxy22
1
@MikeMeade 我从未使用过playground。也许它有一些限制?我有Xcode 7.3,相信我,这两行代码在常规代码中绝对有效,并且可以编译而不出错。 - Shadow Of
1
谢谢,这很有帮助。也许这只是一个测试问题。再见。 - Gixxy22

2

看这个

Ray Wenderlich关于Swift数组的解释

所以,数组只能包含一种类型的对象吗?如果我想要不同类型怎么办? 在Swift中,强烈建议您使用强类型数组,只包含一种类型的对象,语法如下:

var goodArray: [String] = ["foo", "bar"]

话虽如此,从技术上讲,您仍然可以创建包含多种类型对象的数组。但是,在这样做之前,您应该问自己为什么要这样做。在大多数情况下,这并不是最佳选择,您可以通过更好的设计来解决问题。 有了这个前提,下面是如何使用 AnyObject 创建一个包含不同类型对象的 Swift 数组的方法:
var brokenArray: [AnyObject] = ["foo", 1, 12.23, true]

TL;DR:在iOS上,数组是强类型的。如果你需要插入多种类型的元素,请将它们定义为“AnyObject”类型。不过,我不建议这样做。

谢谢,不过你的例子仍然有错误。我明白我可能永远不需要或者不想混合类型,但是如果在技术上应该可以混合它们,我不明白为什么会出错。 - Gixxy22
你收到的错误信息是什么?从技术上讲,你不能混合使用它们。如果你没有给数组指定类型,它会采用其中第一个元素的类型,但它始终是强类型的。 - Rajeev Bhatia
啊,我意识到是因为我没有导入UIKit。问题解决了,现在没有错误了。谢谢。 - Gixxy22

1
另一个选项是在将两个符合相同协议的对象数组连接时,将每个数组单独向上转换为协议:

let arrayName = [1, 2, 3, 4] as [AnyObject] + ["Mike"] as [AnyObject]

如上所述,在使用协议时,这将更加方便:
protocol Foo {}
struct Bar: Foo {}
struct Baz: Foo {}

let barArray = [Bar()]
let bazArray = [Baz()]
let fooArray = barArray as [Foo] + bazArray as [Foo]

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