Arrays &引用;表达式类型不明确,没有更多上下文”;带数组

Arrays &引用;表达式类型不明确,没有更多上下文”;带数组,arrays,swift,Arrays,Swift,我在xCode 7.3游乐场学习Swift 2.0 我有一个数组,如下所示: var arrayName:Array = [1, 2, 3, 4, "Mike"] 我得到了以下错误: 表达式类型不明确,没有更多上下文 现在,当我从数组中删除字符串时,错误消失了,但是Swift显然允许在数组中使用多种类型,所以我不明白它为什么出错 有什么想法吗 干杯错误说明一切。您可以这样修复它,例如: var arrayName: Array<AnyObject> = [1, 2, 3, 4, "

我在xCode 7.3游乐场学习Swift 2.0

我有一个数组,如下所示:

var arrayName:Array = [1, 2, 3, 4, "Mike"]
我得到了以下错误:

表达式类型不明确,没有更多上下文

现在,当我从数组中删除字符串时,错误消失了,但是Swift显然允许在数组中使用多种类型,所以我不明白它为什么出错

有什么想法吗


干杯

错误说明一切。您可以这样修复它,例如:

var arrayName: Array<AnyObject> = [1, 2, 3, 4, "Mike"]
然后
arrayName
将隐式获取类型
Array

这都是关于类型识别的。您有两个选项:使用显式的完整的类型声明,或者您可以让swift编译器尝试识别类型

检查此选项

那么,数组只能包含一种类型的对象?如果我想要不同的类型呢? 在Swift中,强烈建议您创建只包含一种对象类型的强类型数组,语法如下:

也就是说,从技术上讲,您仍然可以创建包含多种类型对象的数组。然而,在你这么做之前,你应该问问自己为什么要这么做。在大多数情况下,这并没有最好的意义,您可能会设计出更干净的解决方案。 话虽如此,下面介绍如何使用AnyObject创建包含不同类型对象的Swift数组:


TL;DR:-阵列在iOS上是强类型的。如果需要插入多种类型的元素,请将其设置为“AnyObject”类型。但不建议这样做。

另一个选项是将符合同一协议的两个对象数组连接起来时非常有用,即将每个数组分别向上投射到协议中:

让arrayName=[1,2,3,4]作为[AnyObject]+[“Mike”]作为[AnyObject]

如上所述,在使用协议时,这将更加方便:

protocol Foo {}
struct Bar: Foo {}
struct Baz: Foo {}

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

我明白了,谢谢。尽管您的第一个示例给出了:error:type'Int'的值不符合预期的元素类型'AnyObject',并且您的第二个示例仍然给出了初始错误message@MikeMeade我从未在操场上玩过。也许有一些限制?我有Xcode 7.3,相信我,这两行代码在常规代码中绝对有效,编译时没有错误。谢谢,这很有帮助。也许这只是一个操场上的问题。谢谢,但是你的例子仍然有错误。我知道我可能永远都不需要或不想混合类型,但是我不明白如果你在技术上应该能够混合类型,为什么会出错。你收到的错误消息到底是什么?从技术上讲,你不能把它们混在一起。数组采用其中第一个元素的类型,如果你不给它一个,但它总是强typedah,我意识到这是因为我没有导入UIKit。问题解决了,现在没有错误。谢谢问题是因为我没有进口UIKit。
var goodArray: [String] = ["foo", "bar"]
var brokenArray: [AnyObject] = ["foo", 1, 12.23, true]
protocol Foo {}
struct Bar: Foo {}
struct Baz: Foo {}

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