【问题标题】:"type of expression is ambiguous without more context" with an array带有数组的“表达式类型不明确,没有更多上下文”
【发布时间】:2016-10-10 05:48:33
【问题描述】:

我在 xCode 7.3 游乐场学习 Swift 2.0。

我有一个数组如下:

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

我收到以下错误:

没有更多上下文,表达式的类型是模棱两可的

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

有什么想法吗?

干杯

【问题讨论】:

  • 问题是因为我没有导入 UIKit。

标签: arrays swift


【解决方案1】:

另一个选项在连接符合相同协议的 2 个对象数组时很有用,它是将每个数组分别向上转换到协议:

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]

【讨论】:

    【解决方案2】:

    看看这个

    Ray Wenderlich on Swift Arrays

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

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

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

    var brokenArray: [AnyObject] = ["foo", 1, 12.23, true]
    

    TL;DR:- 数组在 iOS 上是强类型的。如果您需要插入多种类型的元素,请将它们设为“AnyObject”类型。不过不推荐这个。

    【讨论】:

    • 谢谢,但是您的示例仍然错误。我知道我可能永远不需要或不想混合类型,但是我不明白如果你在技术上应该能够混合它们,为什么会出错。
    • 您收到的错误信息到底是什么?从技术上讲,你不能混合它们。如果您不给它一个数组,则该数组将采用其中第一个元素的类型,但它始终是强类型
    • 啊,我意识到是因为我没有导入UIKit。问题解决了,现在没有错误了。谢谢
    【解决方案3】:

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

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

    或者,更简单,

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

    那么arrayName 将隐式获得Array&lt;NSObject&gt; 类型。

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

    【讨论】:

    • 我明白了,谢谢。尽管您的第一个示例给出了:错误:“Int”类型的值不符合预期的元素类型“AnyObject”
    • 你的第二个例子仍然给了我最初的错误信息
    • @MikeMeade 我从未使用过游乐场。也许它有一些限制?我有 Xcode 7.3,相信我,这两行在常规代码中绝对有效并且编译时没有错误。
    • 谢谢,很有帮助。也许它只是一个游乐场问题。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2019-02-01
    相关资源
    最近更新 更多