我尝试了以下方法:
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] 举报,一经查实,本站将立刻删除。