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

shortest code to create an array of random numbers in swift?

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

我尝试了以下方法:

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

但它 returns 出现以下错误:

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

我做错了什么?


出于某种原因,对我的第一次尝试稍作调整似乎效果很好

map(1...1000) { [=2=] - [=2=] + arc4random() }

现在的问题是,我不明白为什么这种调整后的方法有效,为什么初始方法不起作用...

有什么想法吗?

Swift愿意推断类型,但只能处理这么多歧义就放弃了。

map(1...100) { arc4random() } 的情况下,关于类型的不确定性太多了。具体来说,整数文字 1 和 100。它们可能是 IntInt8UInt32……有时 Swift 会默认为 Int,但如果在它可能会失去平衡并拒绝的声明。

在这种情况下,在同一条语句中,它试图找出 { arc4random() } 的类型。它应该能够推断出 return 类型是 UInt32 因为那是 arc4random return 的类型。但是输入类型是什么?你没有在表达式中使用它,所以没关系,但是 Swift 必须让它成为某种东西,它不知道是什么。

{ [=19=] - [=19=] + arc4random() } 修复它的原因是帮助确定 [=20=] 的类型 - 它必须是 UInt32 因为这是你唯一可以添加的东西arc4random 的输出。所以这使得闭包的类型 UInt32 -> UInt32。这意味着 1100 的类型也必须是 UInt32。这意味着 1...10 必须是 Range

最后,您收到有关 ClosedInterval 不符合 SequenceType 的投诉的原因是因为 ... 运算符有两种可能的 return 类型 – RangeClosedInterval。你想要一个 Range 但 Swift 不知道 - 它不能使 Range ClosedInterval 工作。 Swift 编译器错误往往会列出许多可能不起作用的选项之一,通常不是您要尝试的选项,这可能有点令人困惑。

解决此问题而不诉诸 [=37=] - [=37=] 技巧的更好方法可能是这样的:

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

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