【问题标题】:ObjC to Swift array loop , need help pleaseObjC 到 Swift 数组循环,请需要帮助
【发布时间】:2015-11-05 18:58:26
【问题描述】:

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

for (NSArray *newArray in myArray) {

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

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

我正在尝试使用 Swift 做同样的事情,但我正在努力寻找获取 componentsSeperatedByString 的方法:

for newArray in myArray {

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

【问题讨论】:

  • 如果您显示 myArray 的声明以及实际问题所在的一些药物,这可能会有所帮助。
  • myArray 是对象及其向量的二维数组。然后我遍历每个对象并拉出它的每个向量进行测试,因此 newArray 的每个元素都是一个字符串向量,例如。 swift 中的“150.10 , 310.00”我似乎找不到分离向量的方法。它会让我做 newArray.componentsSeparatedByString(",") 但不是 newArray[I].componentsSeperatedByString(",")

标签: objective-c arrays swift


【解决方案1】:

第一步是将您的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,正如 Helium 所指出的那样,它将数组的数组变成一个简单的数组:

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

当然,您也可以使用另一个 map 调用将其提取为 [[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]]

【讨论】:

    【解决方案2】:

    如果你想要 pnt,你可以使用 flatmap,它将二维数组扁平化成一个带有点的数组。

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

    【讨论】:

    • 这似乎与原始代码不一样。请注意,点被声明为范围的本地,因此它似乎没有累积。
    • 基本上我想要做的是使用 for 循环循环存储为字符串的向量数组: "150.10, 310.20" , "400.10, 310.20" 等。我的快速循环上面的 newArray 只被视为一个元素而不是一个数组,所以我不能做 newArray[I].componentsSeperatedByString(",")
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多