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

mar*_*ves 4 random arc4random swift

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

我尝试了以下方法:

map(1...1000) { arc4random() } 
Run Code Online (Sandbox Code Playgroud)

但它返回以下错误:

error: type 'ClosedInterval<T>' does not conform to protocol 'SequenceType'
Run Code Online (Sandbox Code Playgroud)

我做错了什么?


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

map(1...1000) { $0 - $0 + arc4random() }
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Air*_*ity 9

斯威夫特愿意推断类型,但它只能在它放弃之前处理这么多的歧义.

在这种情况下map(1...100) { arc4random() },关于类型是什么的太多不确定性.具体来说,整数常量1到100,他们可能是Int,Int8,UInt32...有时候斯威夫特将默认为Int,但如果有在声明中更含糊它可能会遭到削减,平衡和拒绝.

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

写作{ $0 - $0 + arc4random() }修复它的原因是有助于确定它的类型$0- 它必须是一个UInt32因为这是你可以添加到输出的唯一的东西arc4random.这就是封闭的类型UInt32 -> UInt32.这意味着的类型1和100也必须是UInt32.这意味着1...10必须是一个Range

最后,您收到ClosedInterval不符合要求的投诉的原因SequenceType是因为...运营商有两种可能的退货类型- Range和ClosedInterval.你想要一个Range但是Swift不知道 - 它无法制造Range 或 ClosedInterval工作.Swift编译器错误倾向于列出许多可能无效的选项之一,通常不是您尝试的选项,这可能有点令人困惑.

更好的方法来解决这个问题,而不是诉诸于$0 - $0技巧可能是这样的:

let a  = map(1...100) { _ in arc4random() }
Run Code Online (Sandbox Code Playgroud)

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