【问题标题】:Multiple errors with using multidimensional array of generics使用多维泛型数组的多个错误
【发布时间】:2016-06-07 20:30:46
【问题描述】:

我已经在 Objective-C 中完成了这项工作,但我无法在 Swift 中完成我想做的事情。
我正在尝试旋转任何类型的二维数组。我正在使用泛型,以便可以使用 Strings & Ints 或任何其他类型。

import UIKit

let someArray = [[1,2,3],[7,8,9],[11,93,87]]

print(someArray[0])


func rotateArray<T> (array:[[T]]) ->Array{
    var tempArray = [[T]]()

    for i in 0..<array.count{

        for j in 0..<array.count{

            tempArray[j][array.count-i-1] = array[i][j]
        }

    }
    return tempArray

}

someArray.count

let x = rotateArray(someArray)

但是我收到以下错误(可能还有其他我不知道的错误),我还阅读了this question 和其他一些错误,但与它无关。

  • reference to generic type 'Array' requires arguments in &lt;..&gt;
  • Binary Operator '..&lt;' Cannot be applied to two 'Int' operands
  • 修复最初的两个错误后编辑fatal error: Index out of range

我做错了什么?请提供详细信息,我是一个完整的菜鸟。

【问题讨论】:

    标签: arrays swift generics


    【解决方案1】:

    你已经写了返回类型-&gt; Array,但是由于Array是generic,你需要指定它包含的内容,比如Array&lt;Something&gt;或者等价的[Something]

    看起来,您希望返回与输入相同的“形状”/数组类型,因此您可以使用 -&gt; [[T]] 作为返回类型。

    (我不确定为什么编译器会产生关于 ..&lt; 的错误,但如果您解决第一个问题,它就会消失。)

    【讨论】:

    • 好的,现在一切都很好,除了这一行:let x = rotateArray(someArray) 会产生此错误:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0) 并查看here 似乎并没有解决我的问题,因为我已经通过了正确的参数...
    • 如果您运行代码,您将在控制台输出中看到fatal error: Index out of range。现在它编译好了,你只需要调试你的算法:-)
    • 我不太确定,但似乎错误是我 jumping 将值放置为 0 以外的索引的结果。因为我打印了索引的所有值但我没有得到任何负值。我的第一个索引是 [0][2] 并且在那里我得到了致命错误。任何的想法?你能指导我一些方向吗?
    • 我认为问题在于您如何使用 tempArray。除非索引 0 已经存在,否则您不能使用 tempArray[0]=x,但您的 tempArray 开始时为空。也许你可以从一个全零的数组开始,或者你可以使用append
    【解决方案2】:

    除了让你的方法返回类型[[T]],你还有其他问题。您正在实例化 tempArray(将在其中保存数组的数组),但您没有实例化那些内部数组。而且您不能只使用下标运算符,而是必须 append 到您各自的数组。

    例如,如果你想顺时针旋转 90 度,那就是:

    func rotateArray<T> (array:[[T]]) -> [[T]] {
        var tempArray = [[T]]()
    
        for column in 0 ..< array.first!.count {
            var rowArray = [T]()
            for row in (0 ..< array.count).reverse() {
                rowArray.append(array[row][column])
            }
            tempArray.append(rowArray)
        }
    
        return tempArray
    }
    

    因此

    [[1, 2, 3],
    [7, 8, 9],
    [11, 93, 87]]

    变成

    [[11, 7, 1],
    [93, 8, 2],
    [87, 9, 3]]

    【讨论】:

    • 谢谢罗伯。你究竟是如何解决内部数组的问题的——没有被实例化?还有为什么我们不能使用下标运算符?
    • 我们在for j ... 循环中做的第一件事就是将[T]() 附加到数组中。这就是我们实例化内部数组的地方。为什么不能使用下标运算符?数组下标运算符(与字典不同)的意思是“用这个值替换这个索引处的项目”。它不用于附加到数组,仅用于更新它们。
    • 你的意思是如果我nils 或之前的任何东西填充数组,那么我就可以使用下标运算符?
    • 是的,但是您必须处理可选的T 对象(可能是隐式包装的对象)的矩阵,这似乎您正在更改传递的矩阵的性质给我们。
    • 谢谢。我不得不学习大步……这更具可读性。我自己的答案的逻辑是可以的,只是索引仍然超出范围,因为它一开始就跳转到数组 [0][2]。您正在以不会跳转到特定索引的反向格式进行操作。仅出于学习目的,您能告诉我如何按照我的方式完成吗?还有你为什么要加第一个!
    猜你喜欢
    • 2011-07-23
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多