在swift中创建随机数组的最短代码?

时间:2015-01-07 01:02:16

标签: swift random arc4random

我想创建一个随机数组(Int,Int32)

我尝试了以下内容:

map(1...1000) { arc4random() } 

但它返回以下错误:

error: type 'ClosedInterval<T>' does not conform to protocol 'SequenceType'

我做错了什么?


出于某种原因,对我的第一次尝试的轻微调整似乎工作得很好

map(1...1000) { $0 - $0 + arc4random() }

现在的问题是,我不明白为什么这个调整接近有效以及为什么最初的方法没有......

有什么想法吗?

1 个答案:

答案 0 :(得分:9)

斯威夫特愿意推断类型,但它只能在它放弃之前处理这么多含糊不清。

map(1...100) { arc4random() }的情况下,对于类型是什么存在太多不确定性。具体来说,整数文字1和100.它们可以是IntInt8UInt32 ...有时Swift会默认为Int但是如果语句中有更多歧义,它可以失去平衡并拒绝。

在这种情况下,在同一声明中,它试图找出{ arc4random() }的类型。它应该能够推断出返回类型为UInt32,因为这是arc4random返回的内容。但输入类型是什么?你没有在表达式中使用它,所以没关系,但是Swift必须做些什么,而且它不知道是什么。

编写{ $0 - $0 + arc4random() }修复它的原因是有助于确定$0的类型 - 它必须是UInt32,因为这是您可以添加到输出的唯一内容arc4random。这样就形成了闭包UInt32 -> UInt32的类型。这意味着1100的类型也必须是UInt32。这意味着1...10必须是Range

最后,您收到有关ClosedInterval不符合SequenceType的投诉的原因是因为...运算符有两种可能的返回类型 - RangeClosedInterval。您想要Range,但Swift不知道 - 它无法使Range ClosedInterval正常工作。 Swift编译器错误倾向于列出许多可能无效的选项之一,通常不是您尝试的选项,这可能有点令人困惑。

更好的解决方法而不诉诸$0 - $0技巧可能是这样的:

let a  = map(1...100) { _ in arc4random() }

_表示您不关心闭包的输入。提供一个输入参数(甚至是一个匿名的参数)似乎足以让Swift放松一点,默认为Int两个整数文字。