【问题标题】:swift convert Range<Int> to [Int]迅速将 Range<Int> 转换为 [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] 

它们也不起作用。

【问题讨论】:

    标签: ios arrays swift int range


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2015-03-17
          • 2021-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-03
          • 2012-01-07
          • 1970-01-01
          • 2018-04-28
          相关资源
          最近更新 更多