2016-10-06 30 views
6

Nó thực sự là một câu hỏi rất đơn giản, nhưng sau một giờ tôi không thể giải quyết vấn đề của tôi.Swift 3 2d mảng Int

Tôi cần tạo một mảng 2d Int.

var arr = [[Int]]() 
or 
var arr : [[Int]] = [] 

đã cố gắng để thay đổi giá trị: Lỗi

arr[x][y] = 1 

gây tử vong: Index ra khỏi phạm vi

Tôi có nên sử dụng APPEND hay tôi cần xác định kích thước của mảng?

Tôi đang bối rối ..

Trả lời

17

Nó không thực sự đơn giản. Dòng:

var arr : [[Int]] = [] 

Tạo biến loại Array of Array of Int và ban đầu mảng trống. Bạn cần phải cư trú này giống như bất kỳ mảng nào khác trong Swift.

Hãy bước trở lại một mảng duy nhất:

var row : [Int] = [] 

Bây giờ bạn có một mảng trống. Bạn không thể chỉ làm:

row[6] = 10 

Trước tiên, bạn cần phải thêm 7 giá trị cho mảng trước khi bạn có thể truy cập giá trị tại index 6 (giá trị thứ 7).

Với mảng mảng của bạn, bạn cần phải điền vào mảng bên ngoài với toàn bộ các mảng bên trong. Và mỗi mảng trong đó cần phải được điền đầy đủ với các giá trị thích hợp.

Dưới đây là một trong những cách đơn giản để khởi tạo mảng lại mảng giả sử bạn muốn có một ma trận điền sẵn với tất cả các giá trị thiết lập để 0.

var matrix : [[Int]] = Array(repeating: Array(repeating: 0, count: 10), count: 10) 

Số đếm bên ngoài đại diện cho số hàng và số lượng bên trong đại diện số cột. Điều chỉnh mỗi khi cần.

Bây giờ bạn có thể truy cập bất kỳ tế bào trong ma trận:

matrix[x][y] = 1 // where x and y are from 0 to rows-1/columns-1 
+0

Cảm ơn bạn rất nhiều, Nó hoạt động với bất kỳ loại mảng nào? Chẳng hạn như .. mảng của UIView và khác –

+0

Nó nên vì 'mảng 'có thể giữ bất kỳ loại. Chỉ cần thay đổi khai báo và giá trị được truyền vào tham số 'repeating' bên trong. Bạn thậm chí có thể tạo các giá trị tùy chọn và chuyển vào 'nil' cho giá trị lặp lại. – rmaddy

1

Không chỉ bạn cần phải khởi tạo cả hai mảng và subarrays trước khi có thể gán bất kỳ giá trị, mà còn mỗi chiều dài mảng phải lớn hơn vị trí chỉ mục mà bạn đang cố gắng đặt.

Điều này là do Swift không khởi tạo các mạng phụ cho bạn, không tăng độ dài mảng khi gán cho chỉ mục.

Ví dụ, đoạn mã sau sẽ thất bại:

var a = [Int]() 
a[0] = 1 
// fatal error: Index out of range 

Thay vào đó, bạn có thể khởi tạo một mảng với số phần tử mà bạn muốn giữ, điền nó với một giá trị mặc định, không ví dụ:

var a = Array(repeating: 0, count: 100) 
a[0] = 1 
// a == [1, 0, 0, 0...] 

để tạo ra một ma trận 100 100 khởi tạo giá trị 0:

var a = Array(repeating: Array(repeating: 0, count: 100), count: 100) 
a[0][0] = 1 

Nếu bạn không muốn chỉ định kích thước ban đầu cho ma trận của mình, bạn có thể thực hiện theo cách này:

var a = [[Int]]() 
a.append([]) 
a[0].append(1) 
0

Sử dụng từ điển thay cho mảng.

Dựa trên yêu cầu của bạn, bạn có thể sử dụng arrayOfDict hoặc dictOfDict. Trong 4 nhanh chóng trở đi, chúng tôi có thể gán giá trị mặc định.

var arrayOfDict = [[Int: Int]]() 
arrayOfDict[i][j, default: 0] 
arrayOfDict[i][j] = 0 

var dictOfDict = [Int: [Int: Int]]() 
dictOfDict[i, default: [0: 0]][j, default: 0] 
dictOfDict[i][j] = 0