gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:00 25 4
gpt4 key购买 nike

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

我尝试了以下方法:

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

但它返回以下错误:

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

我做错了什么?


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

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

现在的问题是,我不明白为什么这种调整后的方法有效以及为什么最初的方法不...

有什么想法吗?

最佳答案

Swift 愿意推断类型,但它只能在放弃之前处理这么多歧义。

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

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

编写 { $0 - $0 + arc4random() } 修复它的原因是有助于确定 $0 的类型是什么——它必须是 UInt32 因为这是唯一可以添加到 arc4random 输出的内容。所以闭包的类型是 UInt32 -> UInt32。这意味着 1100 的类型也必须是 UInt32。这意味着 1...10 必须是一个 Range

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

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

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

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

关于swift - 在 swift 中创建随机数数组的最短代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27809897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com