Range <Int>를 [Int]로 신속하게 변환


107

범위를 배열로 변환하는 방법

나는 시도했다 :

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] 

그들도 작동하지 않습니다.

답변:


204

당신은 할 필요가 생성Array<Int> 사용 Range<Int>보다는 캐스트 를 보내고.

let intArray: [Int] = Array(min...max)

1
감사합니다. 답장을 보내는 동안 방금 알아 냈습니다
haitham

범위가 크면 충돌하는 것 같습니다. let valuesArray : [Int64] = Array (1 ... 4294967292)-Int 만 처리 할 수 ​​있고 Int64는 처리 할 수 ​​없기 때문일까요?
Daniel Springer

2
@DanielSpringer : 문제를 일으키는 Array의 값이 아니라 언어 사양에서 수정 된 경계를 초과하는 인덱스입니다. 이 거대한 어레이를 유지하기 위해 필요한 RAM의 양을 계산하십시오.
사용자 알 수없는

@userunknown 그래서 값의 유형이 아니라 값의 양? 고마워요!
Daniel Springer

1
@Daniel Springer, 확실히 RandomGenerator를 사용해야하는 작업처럼 들립니다. 여기에서 몇 가지 옵션을 참조하십시오. hackingwithswift.com/articles/102/…
Klaus Busse


14

나는 그것을 알아:

let intArray = [Int](min...max)

다른 사람에게 신용을주기.


13

하다:

let intArray = Array(min...max)

때문에이 작업을해야합니다 Array복용하는 이니셜 라이저가 SequenceTypeRange에 부합를 SequenceType.


10

사용하다 map

let min = 50
let max = 100
let intArray = (min...max).map{$0}

이러한 종류의 질문을 읽는 사람들에게 도움이 될 이유를 추가하는 것이 좋습니다. 예를 들어 Sequence 프로토콜을 구현하는 CoutableClosedRange를 생성하므로 map이 가능하고 map 작업을 수행 할 때 새로운 int를 느리게 생성한다고 말합니다. 일부 배경 지식은 항상 좋은
denis631

다른 답변은 흥미롭지 만 이것은 실제로 질문에 대한 답변입니다. 크게.
Dan Rosenstark

3

흥미롭게도 (적어도 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는 아닙니다.
Corey Zambonie 2011

맞습니다. 저는 이것을 예상하지 못했습니다. 즉, 두 개의 다른 범위 클래스입니다. 아마도 range().
devforfu

1

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에서도 작동합니다.
Ash

0

이와 같은 함수에서 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.