2015-11-05 128 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