2015-11-05 182 views
0

我在ObjC中有以下循環:myArray是一個二維數組。ObjC Swift數組循環,需要幫助

for (NSArray *newArray in myArray) { 

    for (int i = 0; i < newArray.count; i++) { 

     NSArray *points = [newArray[i] componentsSeparatedByString:@","]; 
    } 
}... 

我試圖做使用斯威夫特同樣的事情,但我在努力尋找一種方式來獲得componentsSeperatedByString:

for newArray in myArray { 

     for i in 0..<newArray.count { 
      var pnts:NSArray = newArray[i].componentsSeparatedByString(",") 
     } 
    } 
+0

如果您顯示myArray的聲明以及某些藥物實際的問題是。 –

+0

myArray是對象及其向量的二維數組。然後,我循環遍歷每個對象,並拉出它的每個向量來測試,因此newArray的每個元素都是一個字符串vectory,例如。 「150.10,310.00」在迅速我似乎無法找到一種方法來分離向量。它會讓我做newArray.componentsSeparatedByString(「,」),但不newArray [I] .componentsSeperatedByString(「,」) – TazmanNZL

回答

2

的第一步是將您的NSArray轉換爲具有適當的類型,在這種情況下,它看起來像你想:

if let array = myArray as? [[String]] { 
} 

然後你有多種選擇,其中最有效的的可能是一個嵌套的迭代:

let myArray = NSArray(arrayLiteral: 
    NSArray(arrayLiteral: "150.10,310.20"), 
    NSArray(arrayLiteral: "400.10,310.20", "100,200") 
) 

if let source = myArray as? [[String]] { 
    for array in source { 
     for element in array { 
      print(element.componentsSeparatedByString(",")) 
     } 
    } 
} 
// -> ["150.10", "310.20"] 
// ["400.10", "310.20"] 
// ["100", "200"] 

如果所有你想要做的是提取點,你可以使用地圖:

if let source = myArray as? [[String]] { 
    print(source.map { 
     $0.map { $0.componentsSeparatedByString(",") } 
     } 
    ) 
}  
// -> [[["150.10", "310.20"]], [["400.10", "310.20"], ["100", "200"]]] 

如果你想點摺疊成一個數組,你可以使用flatMap,如氦,這會變成數組的數組,成爲一個簡單的數組指出:

if let source = myArray as? [[String]] { 
    print(source.flatMap { 
     $0.map { $0.componentsSeparatedByString(",") } 
     } 
    ) 
} 
// -> [["150.10", "310.20"], ["400.10", "310.20"], ["100", "200"]] 

當然,您還可以使用另一個地圖調用將其提取爲[[Double]]而不是[[String]]:

if let source = myArray as? [[String]] { 
    print(source.map { 
     $0.map { $0.componentsSeparatedByString(",").map { Double($0)! } } 
    }) 
} 
// -> [[150.1, 310.2], [400.1, 310.2], [100.0, 200.0]] 
0

如果你想PNTS,您可以使用flatmap,這將用點將2D陣列平鋪成單個陣列。

let pnts = myArray.flatMap { array in 
      array.map { object in 
      object.componentsSeparatedByString(",") 
     } 
} 
+0

這似乎沒有做原來的代碼相同的事情。請注意,點在局部範圍內聲明,所以它似乎不會累積。 –

+0

基本上我想要做的是使用for循環來循環存儲爲字符串存儲的向量數組:「150.10,310.20」,「400.10,310.20」等等。我在newArray上方的swift循環僅被看作是一個元素,而不是一個數組,所以我不能做newArray [I] .componentsSeperatedByString(「,」) – TazmanNZL