swift 游乐场中的错误:无法将类型 'Int' 的值分配给类型“[Int]”
Error in swift playground: Cannot assign value of type 'Int' to type '[Int]'
var number: [Int] = [1,2,3,4]
var newArray: [Int] = []
for i in 0...number.count-1{
newArray = number[i] * number[i+1]
}
print(newArray)
我想要这样的输出:[1 * 2, 2 * 3, 3 * 4].
我只是不明白问题出在哪里...
您可以使用map()
let numbers = [1,2,3,4]
let newArray = numbers.enumerated().map { * numbers[([=10=] + 1) % numbers.count] }
也许你不应该循环到 count-1,而是在之前停止并将结果添加到数组:
for i in 0..<number.count-1 {
newArray.append(number[i] * number[i+1])
}
var number: [Int] = [1,2,3,4]
let things = zip(number, number.dropFirst()).map(*)
每当您需要将 [1, 2, 3, 4] 之类的东西变成对 (1, 2), (2, 3) 等时,AdjacentPairs 方法就很有用 - 在 Swift 算法中包裹 - https://github.com/apple/swift-algorithms/blob/main/Sources/Algorithms/AdjacentPairs.swift
或者您可以 zip
一个包含 dropFirst
的集合以获得相同的结果。
并且每当您需要将 [A]
s 变成 [B]
s 然后 map
使用将 A 变成 Bs 的函数。因此,在此示例中,您希望通过乘法将 Int 元组数组(如 [(1,2), (2,3), (3,4)])转换为 Int 数组,如 [2, 6, 12] 2 个 Ints 在一起,所以 map
和 *
这样写的好处是你可以避免数组突变、索引值错误、运行 超出数组末尾等问题,而且通常更容易阅读和思考是否你在没有索引和赋值的情况下表达它。
编译器标记您的问题是您将单个 Int
值分配给 Int
的数组。下面这行将解决眼前的问题:
newArray.append(number[i] * number[i+1])
这应该会通过编译,但会在执行时产生运行时错误。原因是当你试图在 i == number.count-1
时获取 number[i+1]
时,你实际上获取了 number[number.count]
。此条目不存在基于 0 的索引。要从 4 个数组条目中获得 3 个总和,您的循环应迭代 3 次:
for i in 0 ..< number.count-1 {
或者,如果您更喜欢封闭范围:
for i in 0 ... number.count-2 {
如@Dris 建议的那样,一种更快捷的方法是使用 map
。 map
的 return 类型是由乘法结果隐式给出的,所以你可以这样写:
let newArray = number.indices.dropLast().map { i in
number[i] * number[i+1]
}
var number: [Int] = [1,2,3,4]
var newArray: [Int] = []
for i in 0...number.count-1{
newArray = number[i] * number[i+1]
}
print(newArray)
我想要这样的输出:[1 * 2, 2 * 3, 3 * 4].
我只是不明白问题出在哪里...
您可以使用map()
let numbers = [1,2,3,4]
let newArray = numbers.enumerated().map { * numbers[([=10=] + 1) % numbers.count] }
也许你不应该循环到 count-1,而是在之前停止并将结果添加到数组:
for i in 0..<number.count-1 {
newArray.append(number[i] * number[i+1])
}
var number: [Int] = [1,2,3,4]
let things = zip(number, number.dropFirst()).map(*)
每当您需要将 [1, 2, 3, 4] 之类的东西变成对 (1, 2), (2, 3) 等时,AdjacentPairs 方法就很有用 - 在 Swift 算法中包裹 - https://github.com/apple/swift-algorithms/blob/main/Sources/Algorithms/AdjacentPairs.swift
或者您可以 zip
一个包含 dropFirst
的集合以获得相同的结果。
并且每当您需要将 [A]
s 变成 [B]
s 然后 map
使用将 A 变成 Bs 的函数。因此,在此示例中,您希望通过乘法将 Int 元组数组(如 [(1,2), (2,3), (3,4)])转换为 Int 数组,如 [2, 6, 12] 2 个 Ints 在一起,所以 map
和 *
这样写的好处是你可以避免数组突变、索引值错误、运行 超出数组末尾等问题,而且通常更容易阅读和思考是否你在没有索引和赋值的情况下表达它。
编译器标记您的问题是您将单个 Int
值分配给 Int
的数组。下面这行将解决眼前的问题:
newArray.append(number[i] * number[i+1])
这应该会通过编译,但会在执行时产生运行时错误。原因是当你试图在 i == number.count-1
时获取 number[i+1]
时,你实际上获取了 number[number.count]
。此条目不存在基于 0 的索引。要从 4 个数组条目中获得 3 个总和,您的循环应迭代 3 次:
for i in 0 ..< number.count-1 {
或者,如果您更喜欢封闭范围:
for i in 0 ... number.count-2 {
如@Dris 建议的那样,一种更快捷的方法是使用 map
。 map
的 return 类型是由乘法结果隐式给出的,所以你可以这样写:
let newArray = number.indices.dropLast().map { i in
number[i] * number[i+1]
}