为什么Swift Playground中的map(_ :)返回String而不是元组?

时间:2016-12-13 16:46:17

标签: swift swift3

我正在尝试使用Swift Playground使用map(_:)enumerated()来浏览orders数组,将第一个完美匹配返回给客户goods。< / p>

然而,在Swift Playground进行测试时; map(_:)函数在应该是元组时返回一个字符串。

我正在尝试检索索引和值;一个给定的数组过滤器。

现在,我目前的解决方案就是这个;

let orders = [4,2,7]
let goods = 2
var matching:Int = (orders.filter{ $0 == goods }.first) ?? 0 as Int

在此示例中,答案为2;但它没有给我数组的索引。

我在Swift Playground的第二次尝试是

var r = (orders.filter{ $0 == goods }).enumerated().map { (index, element) -> (Int,Int) in
    return (index, element)
}

print (r.first!) // This should report (0,2)

但是,在Swift Playground中打印出侧边栏面板

"(0, 2)\n"

截图:

swift playground

为什么侧边栏会报告这是一个字符串?

在这个例子中有没有办法正确获取索引和元素?

3 个答案:

答案 0 :(得分:2)

获取与商品匹配的订单索引

获取索引&amp;元素:

var r = orders.enumerated().map { ( index, element) -> (Int, Int) in
    return (index, element)
}.filter { (index, element) -> Bool in
    if element == goods {
        return true
    }
    return false
}

或更紧凑:

var r = orders.enumerated().map { index, element in (index, element) }
    .filter { _, element in element == goods ? true : false }

print("r: \(r.first)")

打印:

r: (1, 2)

如果你真的只想找到第一个匹配,那么for循环会更有效率,因为你可以在找到第一个匹配后break

<强>游乐场

您看到的内容"(0, 2)\n"print的结果。它在控制台中输出的内容是(0, 2)加上换行符。

如果您想在侧边栏中查看r.first!的实际值,请删除打印:

print (r.first!)
r.first!

结果:

答案 1 :(得分:2)

print语句将您的输出放在""中,并在最后添加换行符\n

如果你写r.first!,你会发现它实际上是一个元组。

答案 2 :(得分:2)

其他人已经覆盖了答案,这只是一个侧面说明。我建议你打破你的陈述,使其更清楚。

var r = orders.filter{ $0 == goods }
              .enumerated()
              .map{ index, element in (index, element) }