我正在尝试使用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"
截图:
为什么侧边栏会报告这是一个字符串?
在这个例子中有没有办法正确获取索引和元素?
答案 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) }