迅速将 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&lt;Int&gt; 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&lt;Int&gt; 使用Range&lt;Int&gt; 而不是铸造它。

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 有一个初始化器采用SequenceTypeRange 符合SequenceType

【讨论】:

【参考方案6】:

有趣的是,您不能(至少在 Swift 3 和 Xcode 8 中)不能直接使用 Range&lt;Int&gt; 对象:

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>'”

如何将字符串转换为 Int?迅速

无法转换类型“Range<Int>?”的值到预期的参数类型'Range<String.Index>?

无法转换“NSSet”类型的值?到预期的参数类型'Range<Int>'(使用CoreData)

如何将 Range<String.Index> 转换为 NSRange? [复制]