Seri bài viết tự học Objective-C dành cho LTV
Chào mừng các bạn đến với seri bài viết tự học lập trình Objective-C. Seri này sẽ giúp các bạn LTV, dù chỉ có kiến thức lập trình cơ bản, dễ dàng hiểu về Objective-C và nhanh chóng xây dựng những chương trình đơn giản. Hãy cùng bắt tay vào học ngay!
Objective-C là gì?
Nếu bạn đang đọc bài viết này, có lẽ bạn đã có ít kinh nghiệm liên quan đến lập trình và đã biết một vài ngôn ngữ lập trình thông dụng như C hay Java. Tuy nhiên, nếu bạn là fresher hay beginner, chẳng có gì phải lo lắng vì ai trong cuộc đời mà không có "lần đầu". Chẳng qua từ "lần đầu tập đi", "lần đầu tập nói", cho đến "lần đầu tập yêu" và rồi "lần đầu lập trình"; thật sự "lần đầu" thì bỡ ngỡ, nhưng từ lần sau chắc chắn sẽ ổn hơn (chúng tôi hy vọng vậy!). Điều chúng tôi mong đợi là "độ máu" của các bạn với MacOS và Objective-C. Vậy Objective-C là gì? Và nó có giống như C không?
Objective-C là một ngôn ngữ lập trình hướng đối tượng (OOP) được xây dựng dựa trên ngôn ngữ lập trình c . Tuy nhiên, ta cần nhận ra sự khác nhau giữa C và Objective-C. Objective-C là ngôn ngữ lập trình hướng đối tượng, trong khi C lại là ngôn ngữ lập trình hướng thủ tục. Objective-C là ngôn ngữ chính được sử dụng để phát triển hệ điều hành MacOS X cũng như iOS (hệ điều hành chạy trên các thiết bị iPhone, iPod hay iPad). Thật ra, nó là ngôn ngữ được sử dụng để phát triển một hệ điều hành khác mà Apple đã mua về, NeXTSTEP, và hệ điều hành này đã trở thành một phần rất quan trọng giúp cho việc hình thành hệ điều hành chính thức MacOS của Apple sau này.
Do Objective-C được phát triển từ C, nên chúng ta có thể thoải mái sử dụng C trong chương trình viết bằng Objective-C và tất nhiên chương trình sẽ chạy ngon lành. Compiler của Objective-C sẽ chuyển tất cả mã lệnh viết bằng C sang mã biên dịch bằng Objective-C. Chính vì vậy, Objective-C có đầy đủ sức mạnh của ngôn ngữ C và những cải tiến của một ngôn ngữ lập trình hướng đối tượng hiện đại.
Bạn cần phải chuẩn bị những gì để học Objective-C?
Trong chuỗi bài học này, chúng tôi sẽ không tập trung quá nhiều vào việc demo chi tiết quá trình phát triển các ứng dụng cho iPhone hay iPad. Thay vào đó, chúng tôi sẽ chú trọng tới ngôn ngữ Objective-C và vì vậy, tất cả những gì bạn cần chỉ là một máy tính Mac với một bộ compiler như GCC. Nếu bạn đã cài bộ công cụ phát triển cho Mac (Xcode) thì bạn hoàn toàn yên tâm vì máy Mac của bạn đã có GCC compiler và bạn có thể bắt tay ngay vào học Objective-C. Về mặt kinh nghiệm lập trình, chúng tôi cũng không yêu cầu bạn phải có quá nhiều kinh nghiệm về OOP hay đã thành thạo C. Tuy nhiên, nếu bạn đã OK với hai vấn đề trên, thì sẽ là một lợi thế lớn.
Trong trường hợp bạn dùng Windows, chúng tôi khuyên bạn nên dùng compiler khác như Cygwin hay MinGW để dịch chương trình Objective-C. Tuy nhiên, chúng tôi khuyến nghị bạn nên sử dụng hệ thống Mac vì như vậy bạn sẽ tận dụng được hết khả năng và hiệu suất của ngôn ngữ Objective-C.
Compile chương trình đầu tiên viết bằng Objective-C
Giả sử bạn đã viết xong một chương trình bằng Objective-C, vậy làm thế nào bạn có thể dịch và chạy chương trình đó? Đầu tiên, bạn cần chắc chắn rằng máy tính của bạn đã có GCC compiler. Sau đó, ta sẽ tiến hành dịch và chạy dòng lệnh chạy chương trình trên cửa sổ dòng lệnh. Tất cả các ví dụ tôi demo trong chuỗi bài học này đều chạy trên môi trường Mac và bạn hoàn toàn có thể thực thi các công việc liên quan đến khởi tạo và setup chương trình ban đầu thông qua công cụ mang tính trực quan hơn. Đó là bộ công cụ Xcode giúp bạn có thể dễ dàng phát triển những ứng dụng trên nền tảng Mac.
Tuy nhiên, điều bắt buộc đối với lập trình viên khi mới bắt đầu học ngôn ngữ lập trình là phải học cách chạy trên môi trường dòng lệnh thông qua command line. Công cụ chúng tôi sử dụng trên MacOS là Terminal. Để chạy chương trình này, bạn có thể vào Applications > Utilities > Terminal. Chương trình này tương đương với chương trình cmd trong Windows.
Bước 1: Trong cửa sổ Terminal, gõ lệnh: cd /Users/MyName/Desktop/Test
Lệnh cd
giúp bạn di chuyển vào thư mục theo đường dẫn sau lệnh cd
.
Bước 2: Compile chương trình viết bằng Objective-C. Giả sử chương trình của bạn có tên là inputfile.m
(source file sẽ có đuôi là .m). Tiếp tục sử dụng cửa sổ Terminal, bạn gõ lệnh sau: gcc inputfile.m -o outputfile
Kết thúc lệnh này, GCC compiler sẽ dịch ra chương trình chạy có tên là outputfile
.
Bước 3: Để chạy chương trình, bạn chỉ cần gõ lệnh sau trên cửa sổ Terminal: ./outputfile
Cơ bản về lập trình Objective-C
Objective-C không khó để học. Khi bạn đã nắm vững những khái niệm và nguyên tắc lập trình cơ bản , bạn có thể tiếp tục tiến xa hơn nữa. Tuy nhiên, bạn cần có kiến thức cơ bản về ngôn ngữ lập trình C. Và đó là phần còn lại trong buổi học hôm nay, bởi những gì cơ bản của C cũng sẽ được sử dụng lại trong Objective-C. Chúng ta hãy nhìn vào một chương trình cơ bản viết bằng C sau đây:
#include int main() { printf("Hello, World!"); return 0; }
Sau khi chạy chương trình này, bạn sẽ thấy một thông điệp "Hello, World!" trên cửa sổ Terminal.
Bạn có thể bắt đầu tạo một chương trình Objective-C mới bằng cách khởi động Xcode, sau đó tạo project mới. Bạn chọn MacOS > Application > Terminal Command Tool. Chú ý bạn có thể chọn project type là C (nếu viết theo cú pháp của C như ví dụ ở trên) hoặc là Foundation (nếu muốn viết theo cú pháp Objective-C và sử dụng những đối tượng có sẵn trong foundation framework của Objective-C).
Bạn thấy đó, chương trình Objective-C viết theo cú pháp của C nhìn rất quen thuộc, phải không? Điều duy nhất bạn phải làm là nhớ lại những kiến thức cơ bản về C như các hàm IO hay khái niệm về biến.
Biến (Variables)
Phần tiếp theo, ta sẽ tìm hiểu về biến. Biến được sử dụng để lưu trữ các giá trị để chương trình có thể thao tác trên các giá trị đó. Khi khai báo các biến, ta phải chỉ ra tên của biến và kiểu dữ liệu của biến. Nói chung, làm việc với các biến có kiểu dữ liệu cơ bản hoàn toàn giống với C. Một số kiểu dữ liệu cơ bản như sau:
-
int
- dùng để chứa các số nguyên -
char
- dùng để chứa ký tự -
float
- dùng để chứa các số có giá trị thập phân -
double
- như kiểufloat
nhưng có phần thập phân chính xác hơn
Ví dụ:
int age = 30; char grade = 'A'; float height = 1.75; double weight = 68.5;
Khi in giá trị của biến trên màn hình cửa sổ Terminal, chúng ta phải chỉ ra định dạng giá trị cần in (bắt đầu bằng ký tự %
). Chú ý một số định dạng thông dụng như sau:
-
%i
: int -
%f
: float -
%e
: double -
%c
: char
Câu lệnh điều kiện
Khi một chương trình cần phải đưa ra quyết định lựa chọn các tình huống xử lý, chúng ta sẽ sử dụng câu lệnh điều kiện. Nếu không có điều kiện, mỗi khi bạn chạy chương trình sẽ có kết quả giống nhau (giống như ta xem đi xem lại một bộ phim nhiều lần). Bằng cách đưa ra những quyết định dựa trên điều kiện liên quan đến giá trị của các biến, chúng ta có thể thay đổi sự thực thi của chương trình - điều này gần giống với cuộc sống hàng ngày khi bạn lên một kế hoạch nào đó: nếu như thế này thì làm gì, còn không thì làm gì?
Câu lệnh điều kiện đơn giản nhất là câu lệnh if
. Câu lệnh này sẽ xét xem nếu điều kiện trong câu lệnh if
là true thì sẽ thực hiện một thao tác cụ thể nào đó. Ví dụ:
if (age >= 18) { printf("Bạn đã đủ tuổi trưởng thành!"); }
Ngoài ra, để xử lý điều kiện một cách tường minh và đầy đủ nhất, ta có thể sử dụng cấu trúc câu lệnh if..else
. Cấu trúc này cung cấp cho ta xử lý của cả 2 trường hợp: nếu điều kiện đúng thì làm gì và nếu điều kiện sai thì làm gì.
if (age >= 18) { printf("Bạn đã đủ tuổi trưởng thành!"); } else { printf("Bạn chưa đủ tuổi trưởng thành!"); }
Câu lệnh lặp
Bây giờ ta tiếp tục tìm hiểu một trường hợp khác mà các chương trình thường gặp phải. Đó là khi một thao tác phải lặp đi lặp lại nhiều lần (tất nhiên ta phải kiểm soát được số lần lặp), thì lập trình viên cần dùng cấu trúc lệnh nào cho phù hợp? Trong trường hợp này, chúng ta có thể dùng cấu trúc lệnh lặp để xử lý tình huống đó.
Có 3 loại vòng lặp thông dụng là: for
, while
và do..while
. Về mục đích thì cả 3 loại vòng lặp này đều có chung một nhiệm vụ, đó là lặp đi lặp lại một đoạn mã n lần (cố gắng tránh vòng lặp vô tận). Tuy nhiên, cấu trúc của 3 lệnh này có khác nhau chút xíu.
Vòng lặp for
:
for (int i = 0; i < 10; i++) { printf("%d\n", i); }
Vòng lặp while
:
int i = 0; while (i < 10) { printf("%d\n", i); i++; }
Vòng lặp do..while
:
int i = 0; do { printf("%d\n", i); i++; } while (i < 10);
Con trỏ (pointer)
Con trỏ là một khái niệm khá trừu tượng và rất khó của ngôn ngữ lập trình C. Vì Objective-C dùng lại rất nhiều tính chất và kỹ thuật của C, nên không quá ngạc nhiên khi gặp lại con trỏ trong Objective-C. Nếu bạn là fresher trong lĩnh vực lập trình, chúng tôi khuyên bạn nên đọc kỹ phần con trỏ trong C để có cái nhìn rõ ràng hơn về vấn đề này.
Như bạn đã biết, biến dùng để lưu trữ giá trị cho mục đích tính toán và xử lý dữ liệu. Thực tế, khi ta tạo một biến, có nghĩa là ta đã yêu cầu hệ thống cấp phát một ô nhớ để lưu trữ giá trị của biến đó. Tất cả các thao tác liên quan đến dữ liệu trên ô nhớ đó, ta sẽ thực hiện thông qua tên biến.
Trong C, ta có thể thực hiện thao tác với dữ liệu trực tiếp trên ô nhớ thông qua con trỏ. Con trỏ là gì? Thực chất, con trỏ là một kiểu dữ liệu đặc biệt vì nó không lưu trữ những giá trị bình thường mà nó dùng để lưu địa chỉ của biến khác. Điều đó có nghĩa là ta có thể thao tác với dữ liệu trên một ô nhớ thông qua con trỏ đang nắm giữ địa chỉ của ô nhớ đó.
int foo = 123; // Đây là một biến số nguyên int *ptr = &foo; // Đây là một con trỏ tới biến số nguyên
Phần tiếp theo, chúng ta sẽ tiếp tục khám phá về Objective-C.