我想创建一个随机数组(Int,Int32)
我尝试了以下内容:
map(1...1000) { arc4random() }
但它返回以下错误:
error: type 'ClosedInterval<T>' does not conform to protocol 'SequenceType'
我做错了什么?
出于某种原因,对我的第一次尝试的轻微调整似乎工作得很好
map(1...1000) { $0 - $0 + arc4random() }
现在的问题是,我不明白为什么这个调整接近有效以及为什么最初的方法没有......
有什么想法吗?
答案 0 :(得分:9)
斯威夫特愿意推断类型,但它只能在它放弃之前处理这么多含糊不清。
在map(1...100) { arc4random() }
的情况下,对于类型是什么存在太多不确定性。具体来说,整数文字1和100.它们可以是Int
,Int8
,UInt32
...有时Swift会默认为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() }
_
表示您不关心闭包的输入。提供一个输入参数(甚至是一个匿名的参数)似乎足以让Swift放松一点,默认为Int
两个整数文字。