【问题标题】:Swift: Initialize 2D array (error: contextual type 'Int' cannot be used with array literal)Swift:初始化二维数组(错误:上下文类型“Int”不能与数组文字一起使用)
【发布时间】:2017-03-27 12:07:51
【问题描述】:

我正在尝试创建二维整数数组:

var arr: [[Int]] = []
arr[0][0] = [123, 456, 789]

但我在第二行收到以下错误:

error: contextual type 'Int' cannot be used with array literal
arr[0][0] = [123, 456, 789]

你们中的任何人都知道如何将 int 值添加到 2D 数组中而不会出错?

我想在二维数组中添加以下值:

[123, 456, 789]
[2, 3, 5]
[100, 300, 400]

非常感谢您的帮助。

【问题讨论】:

  • var arr = [[123, 456, 789]]; Swift 将为您推断类型 [[Int]]。此外,单个元素 arr[0][0] 不(尚)存在,因此如果您尝试为其分配一个整数(而不是数组,如上所述),您将遇到运行时异常。
  • 你希望你的二维数组包含什么?
  • @dfri 但如果我想在 n 大小的二维数组中添加值?
  • 1) 只需在初始化 let arr = [[123, 456, 789], [2, 3, 5], [100, 300, 400]] 时添加三个子数组,或 2) 将数组初始化为空并使用 append(..) 添加子数组。
  • @AlexanderMomchliov,我想添加整数。我已经更新了我的帖子

标签: ios arrays swift int


【解决方案1】:

arr[0][0] 是单个 Int,但您尝试将 [123, 456, 789] 分配给它,这是一个 [Int](又名 Array<Int>)。

你可以嵌套数组字面量来实现你想要的:

let array = [ //inferred type: [[Int]]
    [123, 456, 789],
    [  2,   3,   5],
    [100, 300, 400],
]

【讨论】:

  • 我希望它是可变数组。如何修改值?
  • 使用var 而不是let,就像编译器建议的那样。
  • 你真的应该阅读Swift Language Guide
【解决方案2】:

我想在二维数组中添加以下值:

[123, 456, 789] 
[2, 3, 5] 
[100, 300, 400]

您可以通过几种不同的方式实现这一目标。

只需在数组初始化时包含子数组

var arr = [[123, 456, 789], [2, 3, 5], [100, 300, 400]]

这允许您让 arr 成为不可变的 (let arr = ...),以防所有子数组在编译时已知,并且您知道以后不需要更改 arr

如果您的数组的内容在编译时不完全已知:您可以使用append(...) 来一一添加子数组

如果子数组在arr 实例化时不可用,您可以使用数组的+= 运算符或append(_:) 方法,在子数组可用时动态将子数组添加到数组中提供

var arr = [[Int]]()

// ... at some later (run-)time point    
let somSubArrProvidedAtRuntime = [100, 300, 400]
arr.append(somSubArrProvidedAtRuntime)
// ....

作为append(_:) 的替代方案,使用append(contentsOf:) 一次添加多个子数组

鉴于上述相同的情况,但一次提供了多个子数组,您可以使用append(contentsOf:) 方法一次将多个子数组附加到数组中

// some (one) sub-arr known at initialization
var arr = [[123, 456, 789]]

// some sub-arrays provided at runtime, a time later 
// than initialization
let subArrB = [2, 3, 5]
let subArrC = [100, 300, 400]

// ... using the `+=` operator for arrays
arr += [subArrB, subArrC]

// ... alternatively, using append(contentsOf:)
arr.append(contentsOf: [subArrB, subArrC])

【讨论】:

  • += [ /* ... */ ] 进行了不必要的阵列安装。也不鼓励附加静态数据。
  • @AlexanderMomchliov 我们不知道这是静态数据还是只是关于动态添加非静态子数组的 OP 示例。 OP 甚至提示您回答非可变数组。鉴于 OP 的(可能的)Swift 初学者级别,一些替代方案可能很有价值,并且性能不应该成为问题,除非分析告诉我们(即使我们确实想要(尝试)尽可能应用最佳实践)。但是感谢您的反馈,OP (Y) 的附加价值此外,您对 Swift 语言指南的参考可能是该线程中对 OP 最有价值的建议。
  • 我的想法是,我们应该只展示最佳实践,并根据 OP 的反馈详细阐述其他内容。新程序员不具备自己比较不同方法的知识。要么展示替代方案并提供优缺点,要么只坚持最可取的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多