chuyển đổi nhanh chóng Phạm vi <Int> thành [Int]


107

làm thế nào để chuyển đổi Phạm vi thành Mảng

Tôi đã thử:

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

nhận lỗi Range<Int> is not convertible to [Int]

Tôi cũng đã thử:

let intArray:[Int] = [min...max]

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

chúng cũng không hoạt động.

Câu trả lời:


204

Bạn cần phải tạo ra một Array<Int>cách sử dụng Range<Int>chứ không phải là diễn viên ing nó.

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

1
cảm ơn, tôi chỉ figured nó trong khi bạn gửi câu trả lời của bạn
Haitham

Điều này dường như bị lỗi nếu phạm vi lớn: let giá trịArray: [Int64] = Array (1 ... 4294967292) - có thể vì nó chỉ có thể xử lý Int chứ không phải Int64?
Daniel Springer

2
@DanielSpringer: Đó không phải là giá trị trong Mảng, nguyên nhân gây ra sự cố, mà là chỉ số vượt quá giới hạn được cố định trong đặc tả ngôn ngữ. Hãy tính xem bạn cần bao nhiêu RAM chỉ để chứa Array khổng lồ này.
người dùng không xác định

@userunknown vì vậy không phải là loại giá trị, mà là số lượng giá trị? Gotcha, cảm ơn!
Daniel Springer

1
@Daniel Springer, nghe có vẻ như là một nhiệm vụ mà bạn chắc chắn nên sử dụng RandomGenerator, hãy xem một số tùy chọn tại đây: hackingwithswift.com/articles/102/…
Klaus Busse


14

Tôi đã hiểu rồi:

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

Cung cấp tín dụng cho người khác.


13

làm:

let intArray = Array(min...max)

Điều này sẽ hoạt động vì Arraycó một trình khởi tạo lấy a SequenceTypeRangetuân theo SequenceType.


10

Sử dụng map

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

thêm tại sao nó hoạt động sẽ có lợi cho những người đang đọc loại câu hỏi này. Ví dụ, nói rằng nó tạo ra một CoutableClosedRange thực hiện giao thức Sequence, do đó có thể có bản đồ và nó tạo ra một int mới một cách lười biếng khi thực hiện thao tác với bản đồ. Một số kiến thức cơ bản luôn luôn là tốt
denis631

Các câu trả lời khác rất thú vị nhưng câu trả lời này thực sự trả lời câu hỏi. Lớn lên.
Dan Rosenstark

3

Điều thú vị là bạn không thể (ít nhất, với Swift 3 và Xcode 8) sử dụng Range<Int>đối tượng trực tiếp:

let range: Range<Int> = 1...10
let array: [Int] = Array(range)  // Error: "doesn't conform to expected type 'Sequence'"

Do đó, như nó đã được đề cập trước đó, bạn cần phải "mở" theo cách thủ công mà bạn có phạm vi như:

let array: [Int] = Array(range.lowerBound...range.upperBound)

Tức là, bạn chỉ có thể sử dụng nghĩa đen.


Lý do cho điều này là vì Ranges không phải là Bộ sưu tập. Sự khác biệt giữa Phạm vi và Phạm vi có thể đếm được là phạm vi sau có thể được lặp lại bởi một giá trị Số nguyên. Vì lý do đó Phạm vi đếm được là một loại tập hợp nhanh chóng nhưng phạm vi thì không.
Corey Zambonie

Đúng vậy, và tôi đã không mong đợi điều này, tức là hai lớp phạm vi khác nhau. Có lẽ là do Pythonic giải thích range().
devforfu

1

Vì Swift 3 / Xcode 8 có một CountableRangeloại, có thể hữu ích:

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]

Nó có thể được sử dụng trực tiếp trong for- invòng lặp:

for i in range {
    print(i)
}

Đây (bây giờ) là cách chính xác để xử lý nhiệm vụ. Cũng hoạt động trong Swift 4.
Ash

0

Bạn có thể triển khai các khoảng thời gian cá thể của ClosedRange & Range với hàm Reduce () trong các hàm như thế này.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.