在Swift中遍历多维数组

5

我正在尝试遍历一个NSArray。我的NSArray是一个字符串数组的数组。以下是前1.5个元素的复制粘贴:

(
    (
    "Tater Tot Nachos",
    "Fried Feta",
    "The Ultimate Feta Bread",
    "Cheese Bread",
    "Aubrees Bread",
    "The Wings!",
    "Coconut Grove Chicken Sicks",
    "Far East Wings",
    "Bacon Brussels Sprouts"
),
    (
    "Shaved Brussels Sprout Salad",
    "Greek Salad",
    "Coronado Cobb Salad",
    "Harvest Salad",

这个函数让我头疼不已。

 func createMenu() {
    if let list = cellDescripters {
        for(index, item) in list.enumerated() {
            for food in item {
                //DO SOMETHING WITH "FOOD"
            }

        }
    }
}

'cellDescripters'是全局变量,它是我在顶部概述的数组,基本上是一个字符串数组的数组。

当我打印'item'的类型时,我发现它是__NSArrayM类型,这是我理解中的NSMutableArray。根据文档,NSMutableArrays是可迭代的。

然而,当我尝试编译这段代码时,我会得到错误:

Type 'Any' does not conform to protocol 'Sequence'

任何帮助都将不胜感激。

1
你为什么在Swift中使用NSArray - rmaddy
我正在将数据从plist文件读取到该数组中。为什么使用NSArray?我不是完全确定,我只是在跟着教程做。除此之外,我还能用什么方式从plist文件中读取数据呢? - Nate Schreiner
1
将 cellDescripters 类型从 NSMutableArray 更改为 [[String]]。 - adarshaU
2个回答

8
我想下面的例子可以帮助你: 例如,我有一个字符串数组的数组,像这样:you = [["饮料", "食品", "供应商"], ["其他东西", "药品"]];
  var arrayExample = [["beverages", "food", "suppliers"],["other stuff", "medicine"]];
//Iterate array through for loop 
       for(index, item) in arrayExample.enumerated() 
         {
            for food in item 
             {
                print("index : \(index) item: \(food)")
            }
       }

输出

index : 0 item: beverages
index : 0 item: food
index : 0 item: suppliers
index : 1 item: other stuff
index : 1 item: medicine

抱歉,我不太明白。你的意思是要准备像这样的字典吗:["0":[饮料","xyx","abc"], "1":[其他东西","药品"]]? - Jaydeep Vyas

1
这里有一个更通用的解决方案,用于在 Swift 中迭代 2D 数组。经过在 iOS 13 上测试,适用于 Swift 4。 仅适用于 Swift 数组,请参考以下链接将您的 NSArray 转换为数组:https://dev59.com/0Zzha4cB1Zd3GeqPHJAs#40646875
// 2D array extension explanation: https://dev59.com/uaLia4cB1Zd3GeqPdRPD#44201792
fileprivate extension Array where Element : Collection, Element.Index == Int {

    typealias InnerCollection = Element
    typealias InnerElement = InnerCollection.Iterator.Element

    func matrixIterator() -> AnyIterator<InnerElement> {
        var outerIndex = self.startIndex
        var innerIndex: Int?

        return AnyIterator({
            guard !self.isEmpty else { return nil }

            var innerArray = self[outerIndex]
            if !innerArray.isEmpty && innerIndex == nil {
                innerIndex = innerArray.startIndex
            }

            // This loop makes sure to skip empty internal arrays
            while innerArray.isEmpty || (innerIndex != nil && innerIndex! == innerArray.endIndex) {
                outerIndex = self.index(after: outerIndex)
                if outerIndex == self.endIndex { return nil }
                innerArray = self[outerIndex]
                innerIndex = innerArray.startIndex
            }

            let result = self[outerIndex][innerIndex!]
            innerIndex = innerArray.index(after: innerIndex!)

            return result
        })
    }

}

一个例子用法:
let sampleMatrix = [
    ["a", "b", "c"],
    ["d", "e"],
    [],
    ["f"],
    []
]

// Should print: a, b, c, d, e, f      
for element in sampleMatrix.matrixIterator() {
    print(element)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接