ObjC到Swift数组循环,需要帮助

时间:2015-11-05 18:58:27

标签: objective-c arrays swift

我在ObjC中有以下循环:myArray是一个2D数组。

for newArray in myArray {

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

我正在尝试使用 Swift 做同样的事情,但我很难找到获取componentsSeperatedByString的方法:

{{1}}

2 个答案:

答案 0 :(得分: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"]

如果你想要做的就是提取积分,你可以使用map:

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

如果你想将这些点折叠成一个数组,你可以使用像Helium所指出的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]]

答案 1 :(得分:0)

如果你想要pnts,你可以使用flatmap,它会将2D数组展平为带有点的单个数组。

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