迅速将 Range<Int> 转换为 [Int]
Posted
技术标签:
【中文标题】迅速将 Range<Int> 转换为 [Int]【英文标题】:swift convert Range<Int> to [Int] 【发布时间】:2015-11-13 05:05:46 【问题描述】:如何将范围转换为数组
我试过了:
let min = 50
let max = 100
let intArray:[Int] = (min...max)
得到错误Range<Int> is not convertible to [Int]
我也试过了:
let intArray:[Int] = [min...max]
和
let intArray:[Int] = (min...max) as [Int]
它们也不起作用。
【问题讨论】:
【参考方案1】:我想通了:
let intArray = [Int](min...max)
把功劳归功于别人。
【讨论】:
【参考方案2】:您需要创建一个Array<Int>
使用Range<Int>
而不是铸造它。
let intArray: [Int] = Array(min...max)
【讨论】:
谢谢,我只是在您发送答案时想通了 如果范围很大,这似乎会崩溃:let valuesArray: [Int64] = Array(1...4294967292) - 可能是因为它只能处理 Int 而不能处理 Int64? @DanielSpringer:导致问题的不是数组中的值,而是超出语言规范中固定范围的索引。请计算一下您需要多少 RAM,仅用于容纳这个巨大的 Array。 @userunknown 所以不是值的类型,而是值的数量?明白了,谢谢! @Daniel Springer,这听起来像是您绝对应该使用 RandomGenerator 的任务,请参阅此处的一些选项:hackingwithswift.com/articles/102/…【参考方案3】:使用map
let min = 50
let max = 100
let intArray = (min...max).map$0
【讨论】:
添加它的工作原理将对阅读此类问题的人有益。例如,声明它创建了一个实现 Sequence 协议的 CoutableClosedRange,因此 map 是可能的,并且在执行 map 操作时它会懒惰地产生一个新的 int。一些背景知识总是好的 其他答案很有趣,但这个答案实际上回答了这个问题。大了。【参考方案4】:将 Range 放入 init 中。
let intArray = [Int](min...max)
【讨论】:
完美!谢谢@MrBeardsley【参考方案5】:做:
let intArray = Array(min...max)
这应该可以工作,因为Array
有一个初始化器采用SequenceType
和Range
符合SequenceType
。
【讨论】:
【参考方案6】:有趣的是,您不能(至少在 Swift 3 和 Xcode 8 中)不能直接使用 Range<Int>
对象:
let range: Range<Int> = 1...10
let array: [Int] = Array(range) // Error: "doesn't conform to expected type 'Sequence'"
因此,如前所述,您需要手动“解包”您的范围,例如:
let array: [Int] = Array(range.lowerBound...range.upperBound)
也就是说,你可以只使用文字。
【讨论】:
这是因为范围不是集合。 Range 和 Countable Range 之间的区别在于后者可以通过 Integer 值进行迭代。因此 Countable Range 是 swift 中的集合类型,但 range 不是。 没错,我没想到会这样,即两个不同的范围类。可能是由于对range()
的Pythonic 解释。【参考方案7】:
从 Swift 3/Xcode 8 开始有一个CountableRange
类型,可以很方便:
let range: CountableRange<Int> = -10..<10
let array = Array(range)
print(array)
// prints:
// [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
可以直接在for
-in
循环中使用:
for i in range
print(i)
【讨论】:
这是(现在)处理任务的正确方法。也适用于 Swift 4。【参考方案8】:您可以在这样的函数中使用 reduce() 实现 ClosedRange 和 Range 实例间隔。
func sumClosedRange(_ n: ClosedRange<Int>) -> Int
return n.reduce(0, +)
sumClosedRange(1...10) // 55
func sumRange(_ n: Range<Int>) -> Int
return n.reduce(0, +)
sumRange(1..<11) // 55
【讨论】:
以上是关于迅速将 Range<Int> 转换为 [Int]的主要内容,如果未能解决你的问题,请参考以下文章
无法将类型“[Surah]”的值转换为预期的参数类型“Range<Int>”
SwiftUI 核心数据错误 - “无法将 'FetchedResults<GCItem>' 类型的值转换为预期的参数类型 'Range<Int>'”
无法转换类型“Range<Int>?”的值到预期的参数类型'Range<String.Index>?