Mảng là một trong những cấu trúc rất quan trọng và cũng rất hay gặp trong lập trình. Trong bất kỳ ngôn ngữ nào cũng vậy, việc thao tác với mảng là điều tất yếu sẽ xảy ra. Phần này mình sẽ tập trung trình bày phương pháp để thao tác với mảng trong Swift.
Mảng là gì?
Mặc dù mình nghĩ bạn đã biết nhưng mình vẫn nhắc lại sơ vài khái niệm về mảng nhé. Về cơ bản thì bạn cần nắm 3 ý như sau:
- Mảng thực chất là một đối tượng có khả năng tổ chức và lưu trữ nhiều giá trị có cùng kiểu dữ liệu theo thứ tự.
- Mỗi một giá trị bên trong mảng được quản lý bởi một chỉ số vị trí.
- Nếu bạn nào đã học Objective thì chắc chắn sẽ quen với NSArray. Và mảng trong Swift được kết nối với lớp NSArray của Foundation.
Ở trên là hình ảnh minh hoạ cho mảng các số nguyên đơn giản. Phần này mình chỉ nhắc lại một số khái niệm cơ bạn như vậy thôi. Do học Swift thì mình tin rằng bạn nào cũng đã biết qua ít nhất 1 ngôn ngữ rồi. Nhưng nếu có bạn nào cần giải thích rõ hơn thì cứ comment bên dưới nhé.
Cú pháp tạo mảng
Tuỳ theo từng trường hợp mà bạn sẽ có cách thức tạo mảng khác nhau. Ở nội dung này mình sẽ hướng dẫn bạn 04 phương pháp khai báo mảng:
Phương pháp 1: Tạo mảng rỗng
Đây là cú pháp thông thường hay được sử dụng trong việc khai báo mảng. Cú pháp:
➤ Ví dụ: chúng ta sẽ khai báo một mảng các số nguyên như sau:
Từ ví dụ trên, bạn có thể hiểu một cách đơn giản thế này: “Chúng ta khai báo mảng emptyArray có kiểu Int. Điều đó có nghĩa là các phần tử trong mảng emptyArray cũng phải có cùng kiểu dữ liệu này. Mảng emptyArray sau khi khai báo sẽ là mảng mới và không có phần tử con nào bên trong.”
➤ Lưu ý: việc khai báo mảng trong Swift sẽ không cần khai báo số phần tử như C. Do mảng trong Swift luôn được xem như một mảng động, vì vậy chúng ta có thể thao tác một cách tuỳ ý.
Phương pháp 2: Tạo mảng với giá trị mặc định
Trong trường hợp bạn muốn tạo mảng được thiết lập sẵn 01 giá trị mặc định nào đó cho toàn bộ các phần tử thì bạn có thể thực hiện theo cú pháp dưới đây:
➤ Ví dụ: chúng ta sẽ khai báo một mảng gồm 10 phần tử các số nguyên. Trong đó mỗi phần tử đều được gắn sẵn một giá trị nào đó (ví dụ 11 chẳng hạn) như sau:
Ví dụ trên khá đơn giản và dễ hiểu phải không nào? Mình nghĩ là nhìn vào những chú thích là bạn đã có thể nắm được phương pháp rồi. Do đó phương pháp này mình sẽ không giải thích gì thêm nữa nhé.
Phương pháp 3: Tạo mảng bằng cách gộp giá trị từ 02 mảng khác nhau
Đôi khi trong quá trình viết code, có thể bạn sẽ gặp trường hợp cần gộp 02 mảng lại với nhau thành một mảng mới. Đối với Swift thì việc này được thực hiện khá dễ dàng, nào chúng ta xét ví dụ sau nhé.
Bạn thấy không, việc gộp mảng chỉ đơn giản là sử dụng toán tử cộng “+” mà thôi. Rất đơn giản phải không nào.
Phương pháp 4: Tạo mảng bằng cách gán giá trị trực tiếp cho mảng
Đây cũng là phương pháp hay gặp trong một số trường hợp sử dụng kỹ thuật đánh dấu. Cú pháp khai báo như sau:
Trong cú pháp trên, chúng ta có thể dễ dàng nhận thấy việc tạo mảng có sẵn các giá trị mặc định nào đó chỉ đơn giản là sử dụng phép gán “=” mà thôi.
➤ Ví dụ: khai báo mảng các số nguyên với các giá trị mặc định được gán sẵn như sau.
Thao tác với mảng
Để làm việc với mảng được dễ dàng, bạn hãy lưu ý một số phương thức sau:
Ở trên là 06 phương thức mà bạn sẽ hay sử dụng khi làm việc với mảng. Tất nhiên là mảng còn hỗ trợ bạn rất nhiều phương thức khác, nhưng trong khuôn khổ bài viết thì bạn nắm 06 phương thức trên là đủ rồi. Những phương thức khác sẽ được mình giới thiệu trong những ứng dụng cụ thể ở những bài viết sau.
Ngoài các phương thức trên, bạn cũng cần nắm một số thao tác cơ bản như sau.
Thêm các phần tử vào mảng
Chúng ta sử dụng phương thức append hoặc toán tử “+=” để thêm các phần tử vào mảng.
➤ Ví dụ:
Bạn hãy chú ý những chỗ mình highlight nhé. Ví dụ trên, mình sử dụng phương thức append và toán tử “+=“, cả 02 cách đều là thêm phần tử mới vào cuối mảng. Trong trường hợp này, bạn sử dụng cách nào cũng sẽ đều có kết quả giống nhau.
Truy xuất các phần tử
Như đã trình bày, mỗi một giá trị bên trong mảng được quản lý bởi một chỉ số vị trí. Do đó để truy xuất các phần tử trong mảng, chúng ta sẽ dựa vào chỉ số vị trí của mỗi phần tử.
➤ Ví dụ:
Ví dụ trên chỉ đơn giản là lấy giá trị phần tử thứ 0 trong mảng exampleArray gán vào firstItem. Cũng không có gì khó hiểu phải không nào. Hoặc cũng có thể gán giá trị cho các phần tử trong mảng dựa vào chỉ số vị trí.
Bạn thấy không, làm việc với mảng cần hết sức lưu ý tới chỉ số vị trí của các phần tử trong mảng. Hầu hết mọi thao tác với mảng chủ yếu là tập trung vào việc quản lý vị trí của các phần tử trong mảng mà thôi.
Duyệt mảng
Thông thường chúng ta sẽ sử dụng vòng lặp để duyệt mảng. Tuỳ vào sở thích của mỗi người mà sử dụng cách thức duyệt mảng khác nhau.
➤ Ví dụ:
Trong ví dụ trên, mình sử dụng vòng lặp for…in để duyệt tất cả các phần tử trong mảng. Với mỗi một phần tử duyệt được, mình sẽ in giá trị của nó ra màn hình. Ngoài ra, bạn cũng có thể sử dụng while để duyệt mảng cũng được. Chỗ này thì tuỳ sở thích của từng bạn mà thôi vì vậy mình sẽ không đưa ra một cú pháp cụ thể nào cả.
Bên cạnh đó, bạn cũng có thể sử dụng phương thức enumerated() để duyệt mảng. Phương thức này sẽ trả về một danh sách các bộ giá trị (tuple) chứa thông tin vị trí và giá trị của mỗi phần tử. Cụ thể như sau:
Với cách thức này thì mình sẽ in ra được cả giá trị và vị trí của từng phần tử trong mảng. Đây chỉ là ví dụ minh hoạ để bạn biết thêm cách thức duyệt mảng thôi chứ không hoàn toàn là phải dùng cách này thì mới biết vị trí của phần tử trong mảng, bạn nhé.
Sắp xếp mảng
Chúng ta sẽ sử dụng phương thức sorted() để sắp xếp các phần tử trong mảng tăng dần.
➤ Ví dụ:
Ngoài ra, chúng ta cũng có thể sử dụng closure để tự định nghĩa lại tiêu chí sắp xếp theo ý muốn của mình như sau:
Mặc định thì phương thức sorted là sắp xếp tăng dần, do đó ở ví dụ trên mình định nghĩa lại tiêu chí sắp xếp để phương thức sorted có thể sắp xếp giảm. Cách thức này thì mình áp dụng lại closure đã trình bày ở bài trước, và đây là một ứng dụng của closure. Ví dụ trên mình viết dưới dạng đầy đủ, do đó nhân tiện đây mình muốn bạn hãy thử vận dụng lại kiến thức đã học của closure để viết lại dưới dạng ngắn gọn hơn, hãy thử đi nhé.
➤ Lưu ý: Cả 2 ví dụ trên không sắp xếp trực tiếp trong mảng gốc (exampleArray), mảng gốc vẫn giữ nguyên thứ tự. Nếu bạn muốn sắp xếp trực tiếp trên mảng gốc thì có thể sử dụng phương thức sort (tương tự trên).
Đây là thao tác cuối cùng mình muốn trình bày tới các bạn. Hy vọng rằng qua bài viết này, bạn sẽ hiểu được thêm được một khía cạnh nữa về ngôn ngữ lập trình Swift.
Tổng kết
Trong phần này mình đã trình bày cho bạn cách thức khởi tạo và những thao tác trên mảng trong Swift. Khuôn khổ bài viết này nhằm mục đích hướng dẫn bạn học ngôn ngữ lập trình Swift, do đó mình chỉ trình bày trên khía cạnh học ngôn ngữ mới mà thôi. Còn các kỹ thuật khác trên mảng mang tính chất giải thuật thì bạn hãy tham khảo trong chuyên đề kỹ thuật lập trình và cấu trúc dữ liệu mà mình sắp xây dựng nhé.
tại sao closure trong phần săp xếp đó trả về kiểu logic, mà lại làm nó định nghĩa đc là sắp xếp lớn -> bé ?