微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我尝试了以下方法

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

但它返回以下错误

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

我做错了什么?

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

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

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

有任何想法吗?

解决方法

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

在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必须是一个范围

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

不使用$0 – $0技巧解决这个问题的更好方法可能是这样的:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐