Dù Swift đã trở thành ngôn ngữ chính thức khi phát triển các ứng dụng trên nền tảng Apple thì việc học và hiểu về Objective-C vẫn mang lại nhiều lợi ích cho lập trình viên. Nếu bạn là người mới bắt đầu tìm hiểu về ngôn ngữ này, hãy cùng ITviec thực hiện thử thách 14 ngày chinh phục ngôn ngữ Objective-C theo lộ trình Objective-C tutorial trong bài viết này nhé.
Đọc bài viết để hiểu rõ hơn:
- Vì sao bạn vẫn nên học Objective-C?
- Objective-C tutorial: Lộ trình 14 ngày chinh phục Objective-C
- Các câu hỏi thường gặp về Objective-C
Đọc thêm: Objective-C là gì? Có còn phù hợp để học trong năm 2025?
Vì sao bạn vẫn nên học Objective-C dù “ngôn ngữ đã cũ”?
Theo Báo cáo 2024 – 2025 từ ITviec, hiện nay chỉ có khoảng 8% lập trình viên di động (mobile developer) còn sử dụng Objective-C, một con số khiêm tốn nhất là đối với một ngôn ngữ từng là nền tảng của cả hệ sinh thái Apple.
Tuy nhiên, chính sự khan hiếm đó lại mở ra cơ hội lớn cho những ai thật sự hiểu và làm chủ được nó. Lợi thế của bạn khi học Objective-C là:
- Nhu cầu bảo trì và nâng cấp ứng dụng cũ: Nhiều công ty vẫn duy trì các dự án lớn sử dụng Objective-C. Việc hiểu rõ và sử dụng được ngôn ngữ Objective C này sẽ giúp bạn dễ dàng bảo trì, nâng cấp hoặc tích hợp các tính năng mới vào các ứng dụng hiện có.
- Lợi thế khi làm các dự án chuyển đổi công nghệ: Hiện nay, các công ty công nghệ đang có xu hướng chuyển đổi các sản phẩm sử dụng Objective-C sang ngôn ngữ mới phổ thông hơn như Swift, Flutter, việc hiểu rõ ngôn ngữ Objective-C giúp cho việc chuyển đổi trở nên dễ dàng hơn.
- Cầu nối vững chắc đến Swift: Việc nắm vững Objective-C giúp bạn hiểu rõ hơn về cách hoạt động của các ứng dụng iOS/macOS và dễ dàng chuyển đổi hoặc tích hợp mã giữa hai ngôn ngữ.
- Hiểu sâu về hệ sinh thái Apple: Objective-C là nền tảng của nhiều framework cốt lõi như Cocoa và Cocoa Touch. Nắm vững Objective-C đồng nghĩa với việc bạn có khả năng làm việc hiệu quả với các API hệ thống lâu đời mà nhiều thư viện hiện nay vẫn dựa vào.
- Vẫn có nhu cầu tuyển dụng với mức lương cạnh tranh: Dù không còn phổ biến như trước, lập trình viên Objective-C vẫn được săn đón tại các công ty duy trì ứng dụng cũ hoặc mở rộng tính năng trên các nền tảng hiện tại. Theo Báo Cáo Lương & Thị Trường Tuyển Dụng IT 2024-2025 của ITviec, lập trình viên Objective-C với kinh nghiệm từ 8 năm trở lên có thể đạt mức lương lên đến 100 triệu đồng mỗi tháng. Đây là con số ấn tượng, phản ánh giá trị của những chuyên gia có kỹ năng và kinh nghiệm sâu rộng.
Nếu bạn muốn tận dụng các lợi thế trên, hãy bắt đầu với lộ trình 14 ngày học “tất tần tật” về ngôn ngữ Objective-C dưới đây nhé:
Objective-C tutorial: Lộ trình 14 ngày tự học
Ngày 1: Làm quen với Objective-C và cài đặt môi trường
Để bắt đầu học lập trình với Objective-C, trước hết bạn cần thiết lập môi trường phù hợp.
Hãy làm các bước sau để cài đặt Objective-C và chạy chương trình đầu tiên:
- Bước 1 – Cài đặt Xcode
Đây là IDE chính thức của Apple dành riêng để phát triển phần mềm trên macOS, iOS, iPadOS và watchOS. Để cài đặt Xcode, bạn chỉ cần mở App Store, rồi tìm kiếm Xcode và nhấn Install. Sau khi quá trình cài đặt hoàn tất, hãy mở Xcode ngay lập tức. Trong lần mở đầu tiên này, hệ thống sẽ tự động cấu hình cho bạn.
Sau khi cài đặt xong, bạn có thể mở Xcode và làm quen với thanh toolbar cùng các file mặc định cơ bản trong một project iOS.
- Thanh toolbar nằm ở phía trên cửa sổ Xcode. Bạn có thể chọn thiết bị giả lập (simulator), chạy/dừng ứng dụng hoặc theo dõi trạng thái build.
- Navigator (bên trái) hiển thị danh sách file. Bạn có thể dễ dàng truy cập các thành phần như AppDelegate (quản lý vòng đời ứng dụng), ViewController (viết logic cho giao diện), Main.storyboard (công cụ kéo thả giao diện),…
Làm quen với các phần này giúp bạn hiểu được cách ứng dụng iOS vận hành và biết nên điều chỉnh ở đâu khi viết code.
- Bước 2 – Cài đặt Xcode Command Line Tools
Xcode Command Line là công cụ giúp bạn thao tác dễ dàng hơn trong môi trường Objective-C, nhất là khi bạn không muốn dùng toàn bộ của Xcode hoặc chỉ cần biên dịch nhanh một tập tin Objective-C.
Để cài đặt công cụ này, bạn mở Terminal và chạy lệnh: xcode-select --install
.
Ngày 2, 3 và 4: Tìm hiểu về kiểu dữ liệu, hằng số, biến và toán tử Objective-C
Kiểu dữ liệu trong Objective-C
Kiểu dữ liệu trong Objective-C được phân thành 2 loại chính là nhóm kiểu dữ liệu nguyên thủy (Primitive Data Types) và nhóm kiểu dữ liệu đối tượng (Object Data Types).
Kiểu dữ liệu | Mô tả | Ví dụ | |
Kiểu dữ liệu nguyên thủy | int | Số nguyên | int age = 25; |
float | Số thực chính xác đơn | float pi = 3.14f; | |
double | Số thực chính xác kép | double price = 99.99; | |
char | Ký tự đơn | char grade = 'A'; | |
BOOL | Boolean (Yes or No) | BOOL isActive = YES; | |
Kiểu dữ liệu đối tượng | NSNumber | Bao gói giá trị nguyên thủy như int, float, BOOL thành Object | NSNumber *num = @42; |
NSString | Chuỗi ký tự | NSString *name = @"Linh"; | |
NSArray | Mảng các phần tử object | NSArray *colors = @[@"Red", @"Green"]; | |
NSDictionary | Từ điển (key-value pairs) | NSDictionary *info = @{@"name": @"Linh", @"age": @25}; |
Hằng số trong Objective-C
Hằng số trong Objective-C là các giá trị không thể thay đổi sau khi đã thiết lập. Chúng được sử dụng để lưu trữ nhiều loại dữ liệu như số, chuỗi và boolean.
Để khai báo hằng số trong Objective-C, bạn sử dụng từ khóa const. Hằng số có thể được khai báo ở đầu hàm, phương thức hoặc ở cấp độ toàn cục.
Cú pháp:
const int MAX_COUNT = 100
Trong đó:
MAX_COUNT
là tên của hằng số và 100 là giá trị mà hằng số được đặt thành.- Từ khóa
int
chỉ định kiểu dữ liệu của hằng số.
Có nhiều loại hằng số phổ biến trong Objective-C. Các loại phổ biến nhất gồm:
- Hằng số số học (Numeric Constants)
Là các hằng số biểu diễn các giá trị số như số nguyên, số dấu phẩy động và số phức. Hằng số số có thể được viết bằng ký hiệu thập phân, bát phân hoặc thập lục phân chuẩn.
Ví dụ: Cách khai báo và sử dụng hằng số số học (numeric constant) trong ngôn ngữ Objective-C
Input
// Objective-C program to illustrate numeric constant
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Numeric constant
const int MAX_HEIGHT = 100;
NSLog(@"Max Height: %d", MAX_HEIGHT);
[pool drain];
return 0;
}
Output
“Max Height: 100”
- Hằng số chuỗi (String Constants)
Là các hằng số biểu diễn một chuỗi ký tự, chẳng hạn như từ hoặc cụm từ. Hằng chuỗi có thể được viết bằng dấu ngoặc kép (“) hoặc dấu ngoặc đơn (‘) và có thể chứa bất kỳ tổ hợp nào của các chữ cái, số và ký tự đặc biệt.
Ví dụ:
Input
// Objective-C program to illustrate string constant
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// String constant
NSString * const GREETING = @"Hello, World!";
NSLog(@"%@", GREETING);
[pool drain];
return 0;
}
Output
Hello, World!
- Hằng số boolean (Boolean Constants)
Là các hằng số biểu diễn giá trị đúng hoặc sai. Hằng số Boolean có thể được viết bằng từ khóa YES hoặc NO, hoặc từ khóa TRUE hoặc FALSE.
Ví dụ:
Input
// Objective-C program to illustrate boolean constant
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Boolean constant
const BOOL IS_VALID = YES;
NSLog(@"Is Valid: %d", IS_VALID);
[pool drain];
return 0;
}
Output
Is Valid: 1
- Hằng số đối tượng (Object Constants)
Là các hằng số biểu diễn một đối tượng. Hằng số đối tượng có thể được tạo bằng các phương thức malloc và init và có thể sử dụng để lưu trữ tham chiếu đến một đối tượng.
Ví dụ:
Input
// Objective-C program to illustrate object constant
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Creating object constant
NSString * const PI = [[NSString alloc] initWithFormat:@"%.2f", M_PI];
NSLog(@"Value of PI: %@", PI);
[pool drain];
return 0;
}
Output
Value of PI: 3.14
Biến (variables) trong Objective-C
Biến trong Objective-C là vùng nhớ có tên, được sử dụng để lưu trữ dữ liệu có thể thay đổi trong quá trình chương trình thực thi. Mỗi biến có một kiểu dữ liệu xác định, cho biết cách tổ chức và biểu diễn giá trị trong bộ nhớ, đồng thời quyết định các phép toán có thể áp dụng lên biến đó.
Biến trong Objective-C có các kiểu cơ bản như sau:
STT | Kiểu biến | Mô tả |
1 | char | Đây là kiểu dữ liệu 8-bit, có kích thước một byte. |
2 | int | Bao gồm số nguyên, thường có kích thước 2 hoặc 4 byte. |
3 | float | Đại diện cho giá trị dấu phẩy động với độ chính xác đơn (single-precision). |
4 | double | Đại diện cho giá trị dấu phẩy động với độ chính xác kép (double-precision). |
5 | boolean | Đại diện cho giá trị đúng (true) hoặc sai (false). Trong C99, dùng bool với true/false sau khi #include <stdbool.h>.Trong Objective-C, dùng BOOL với giá trị YES/NO, thường dùng trong các ứng dụng iOS/macOS. |
Để khai báo và khởi tạo một biến trong Objective-C, bạn sử dụng cú pháp:
type var_name = value
Trong đó:
type
là kiểu dữ liệu của biếnvar_name
là tên biến do lập trình viên đặt, dùng để tham chiếu vùng nhớ chứa giá trịvalue
là giá trị được gán cho biến tại thời điểm khai báo
Ví dụ: Khai báo và định nghĩa của một biến.
Input
int main () {
/* variable definition: */
int a, b;
int c;
float f;
/* actual initialization */
a = 10;
b = 20;
c = a + b;
NSLog(@"value of c : %d \n", c);
f = 70.0/3.0;
NSLog(@"value of f : %f \n", f);
return 0;
}
Output
2025-05-21 18:09:16.849 main[127884:127884] value of c : 30
2025-05-21 18:09:16.849 main[127884:127884] value of f : 23.333334
Giải thích: Trong ví dụ trên, chúng ta khai báo các biến extern kiểu int. Trong Objective-C, từ khóa extern cho phép khai báo các biến trên toàn thế giới. Sau đó, trong phương thức main()
, ba biến kiểu int là p, q và r được định nghĩa. Sau đó, khởi tạo r=p*q
, p=7
và q=5
, in đầu ra trên bảng điều khiển.
Toán tử (Operators) trong Objective-C
Toán tử là một ký hiệu cho trình biên dịch biết phép toán nào cần thực hiện. Trong Objective-C, chúng được sử dụng để tạo biểu thức toán học bằng cách sử dụng các biến. Các loại toán tử trong Objective-C gồm:
- Toán tử số học: Thực hiện phép toán số học trên các toán hạng như phép cộng (+), phép trừ (-), phép nhân (*), phép chia (/),…
Phân loại | Mô tả | Ví dụ |
+ | Thực hiện phép cộng 2 toán hạng | int a=5, b=7, c; c = a + b ; // c=12 |
Thực hiện phép trừ 2 toán hạng | int a=5, b=7, c; c = a – b ; // c=-2 | |
* | Thực hiện phép nhân 2 toán hạng | int a=5, b=7, c; c = a * b ; // c=35 |
/ | Thực hiện phép chia 2 toán hạng | int a=20, b=5, c; c = a / b ; // c=4 |
% | Thực hiện phép chia và trả về phần dư | int a=20, b=5, c; c = a % b ; // c=0 |
+ + | Tăng giá trị toán hạng lên 1Khi ++ được đặt làm hậu tố (a++: Dùng giá trị trước, rồi mới tăng.Khi ++ được đặt làm tiền tố (++a): Tăng trước, rồi mới dùng giá trị. | int a = 5; int b = a++; // b = 5, a = 6 (hậu tố: gán xong rồi mới tăng)int x = 5; int y = ++x; // x = 6, y = 6 (tiền tố: tăng x rồi mới gán) |
– – | Giảm giá trị toán hạng đi 1Khi — được đặt làm hậu tố (a–): Dùng giá trị trước, rồi mới giảm.Khi — được đặt làm tiền tố (–a): Giảm trước, rồi mới dùng giá trị. | int a = 6; int b = a–; // b = 6, a = 5 (hậu tố: gán rồi mới giảm)int x = 6; int y = –x; // x = 5, y = 5 (tiền tố: giảm rồi mới gán) |
Ví dụ về toán tử số học:
Input
#import <Foundation/Foundation.h>
int main() {
int a = 21;
int b = 10;
int c ;
c = a + b;
NSLog(@"Line 1 - Value of c is %d\n", c );
c = a - b;
NSLog(@"Line 2 - Value of c is %d\n", c );
c = a * b;
NSLog(@"Line 3 - Value of c is %d\n", c );
c = a / b;
NSLog(@"Line 4 - Value of c is %d\n", c );
c = a % b;
NSLog(@"Line 5 - Value of c is %d\n", c );
c = a++;
NSLog(@"Line 6 - Value of c is %d\n", c );
c = a--;
NSLog(@"Line 7 - Value of c is %d\n", c );
}
Output
2025-05-21 18:18:29.069 main[133696:133696] Line 1 - Value of c is 31
2025-05-21 18:18:29.069 main[133696:133696] Line 2 - Value of c is 11
2025-05-21 18:18:29.069 main[133696:133696] Line 3 - Value of c is 210
2025-05-21 18:18:29.069 main[133696:133696] Line 4 - Value of c is 2
2025-05-21 18:18:29.069 main[133696:133696] Line 5 - Value of c is 1
2025-05-21 18:18:29.069 main[133696:133696] Line 6 - Value of c is 21
2025-05-21 18:18:29.069 main[133696:133696] Line 7 - Value of c is 22
- Toán tử quan hệ (toán tử so sánh): Được sử dụng để so sánh hai giá trị và tìm ra sự khác biệt giữa hai giá trị như bằng ( == ), lớn hơn ( > ), nhỏ hơn ( < ),…
Phân loại | Mô tả | Ví dụ |
= = | So sánh giá trị của hai toán hạng có bằng nhau hay không, nếu bằng nhau thì điều kiện là đúng, nếu không là sai. | int a=5,b=7; (a==b) // sai |
!= | So sánh giá trị của hai toán hạng có bằng nhau hay không, nếu các giá trị không giống nhau thì điều kiện trở thành đúng, nếu không thì trở thành sai. | int a=5, b=7 (A!= B) // Đúng |
> | So sánh giá trị của toán hạng bên trái lớn hơn giá trị của toán hạng bên phải. Nếu giá trị lớn hơn thì điều kiện trở thành đúng, nếu không thì trở thành sai. | int a=7,b =5; (a>b) // đúng |
< | So sánh giá trị của toán hạng bên trái nhỏ hơn giá trị của toán hạng bên phải. Nếu giá trị nhỏ hơn thì điều kiện trở thành đúng, nếu không thì trở thành sai. | int a=5,b=7; (a<b) // đúng |
>= | So sánh giá trị của toán hạng bên trái với lớn hơn hoặc bằng giá trị của toán hạng bên phải. Nếu giá trị lớn hơn hoặc bằng thì điều kiện trở thành đúng, nếu không trở thành sai. | int a=7,b =7; (a>=b) // đúng |
<= | So sánh giá trị của toán hạng bên trái với nhỏ hơn hoặc bằng giá trị của toán hạng bên phải; nếu nhỏ hơn hoặc bằng giá trị thì điều kiện trở thành đúng, ngược lại trở thành sai. | int a=5,b=5; (a<=b) // đúng |
Ví dụ về toán tử quan hệ:
Input
#import <Foundation/Foundation.h>
int main() {
int a = 21;
int b = 10;
if( a == b ) {
NSLog(@"Line 1 - a is equal to b\n" );
} else {
NSLog(@"Line 1 - a is not equal to b\n" );
}
if ( a < b ) {
NSLog(@"Line 2 - a is less than b\n" );
} else {
NSLog(@"Line 2 - a is not less than b\n" );
}
if ( a > b ) {
NSLog(@"Line 3 - a is greater than b\n" );
} else {
NSLog(@"Line 3 - a is not greater than b\n" );
}
/* Lets change value of a and b */
a = 5;
b = 20;
if ( a <= b ) {
NSLog(@"Line 4 - a is either less than or equal to b\n" );
}
if ( b >= a ) {
NSLog(@"Line 5 - b is either greater than or equal to b\n" );
}
}
Output
2025-05-21 18:21:35.683 main[134964:134964] Line 1 - a is not equal to b
2025-05-21 18:21:35.683 main[134964:134964] Line 2 - a is not less than b
2025-05-21 18:21:35.683 main[134964:134964] Line 3 - a is greater than b
2025-05-21 18:21:35.683 main[134964:134964] Line 4 - a is either less than or equal to b
2025-05-21 18:21:35.683 main[134964:134964] Line 5 - b is either greater than or equal to b
- Toán tử logic: Toán tử logic được sử dụng để thực hiện các phép toán logic trên toán hạng. Nó trả về 0 hoặc 1.
Phân loại | Mô tả | Ví dụ |
&& | Nếu cả hai điều kiện đều đúng thì điều kiện đó trở thành đúng. | (1 && 1) // đúng (1 && 0) // sai (0 && 1) // sai (0 && 0) // sai |
|| | Nếu bất kỳ một điều kiện nào là đúng trong hai điều kiện thì điều kiện đó trở thành đúng | (1 || 1) // đúng (1 || 0) // đúng (0 || 1) // đúng (0 || 0) // sai |
! | Nếu điều kiện là đúng thì sẽ trả về sai và ngược lại. | !(1 && 1) // sai !(1 && 0) // đúng !(0 && 1) // đúng !(0 && 0) // đúng |
Ví dụ về toán tử logic
Input
#import <Foundation/Foundation.h>
int main(int argc, const char* argv[]) {
// Sử dụng cú pháp @autoreleasepool mới hơn, thay thế cho NSAutoreleasePool
@autoreleasepool {
// Initializing two numbers
int n1 = 1, n2 = 1;
// Return 1 if both condition are true else return 0
NSLog(@"LOGICAL AND = %d\n", (n1 && n2));
// Return 1 if either of one or all conditions are true else return 0
NSLog(@"LOGICAL OR = %d\n", (n1 || n2));
// Return 1 if condition is false else return 0
NSLog(@"LOGICAL NOT = %d\n", (!n1));
}
return 0;
}
Output
2022-12-06 16:01:31.808 a.out[1514:1514] LOGICAL AND = 1
2022-12-06 16:01:31.812 a.out[1514:1514] LOGICAL OR = 1
2022-12-06 16:01:31.812 a.out[1514:1514] LOGICAL NOT = 0
- Toán tử Bitwise: Là các toán tử thực hiện phép tính trực tiếp trên từng bit của giá trị nhị phân (gồm các chữ số 0 và 1). Chúng thường được dùng để xử lý nhanh và hiệu quả các phép toán liên quan đến bộ nhớ, điều khiển phần cứng hoặc tối ưu hiệu suất.
Phân loại | Mô tả | Ví dụ |
& | Thực hiện phép toán AND giữa các bit của cả hai toán hạng. | int a=5,b=7; (a & b) // 0101 tức là 5 |
| | Thực hiện phép toán OR giữa các bit của cả hai toán hạng | int a=5,b=7; (a | b) // 0111 tức là 7 |
^ | Thực hiện phép toán XOR giữa các bit của cả hai toán hạng. | int a=5,b=7; (a ^ b) // 0010 2 |
~ | Thực hiện phép phủ định từng bit (bitwise NOT). Mỗi bit 0 thành 1, 1 thành 0. Với số nguyên có dấu, kết quả là dạng bù 1 của biểu diễn bù 2, dẫn đến kết quả âm. | int a = 5; int b = ~a; // b = -6 Vì a = 0000…0101 nên ~a = 1111…1010 (tức là -6 nếu dùng 32-bit int) |
<< | Dịch chuyển các bit của toán hạng bên trái sang phía bên trái theo giá trị toán hạng bên phải | int a=5; a << 2 // 10100 tức là 20 |
>> | Dịch chuyển các bit của toán hạng bên trái sang bên phải theo giá trị toán hạng bên phải. | a >> 2 // 001 tức là 1 |
Ví dụ về toán tử Bitwise
Input
// Objective-C program of Bitwise Operations
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// n1 = 5(00000101), n2 = 9(00001001)
int n1 = 5, n2 = 9;
// The result is 00000001
NSLog(@"Bitwise AND(n1&n2) = %d\n", (n1&n2));
// The result is 00001101
NSLog(@"Bitwise OR(n1|n2) = %d\n", (n1|n2));
// The result is 00010010
NSLog(@"LEFT SHIFT(n2<<2) = %d\n", (n2<<2));
// The result is 00000100
NSLog(@"RIGHT SHIFT(n2>>2) = %d\n", (n2>>2));
// The result is 00001100
NSLog(@"XOR(n1^n2) = %d\n", (n1^n2));
// The result is 11111010
NSLog(@"ONCE COMPLIMENT(~n1) = %d\n", (~n1));
[pool drain];
return 0;
}
Output
2022-12-06 16:26:01.001 a.out[1091:1091] Phép toán AND theo bit (n1&n2) = 1
2022-12-06 16:26:01.005 a.out[1091:1091] Phép toán OR theo bit (n1|n2) = 13
2022-12-06 16:26:01.005 a.out[1091:1091] PHÉP DỊCH TRÁI (n2<<2) = 36
2022-12-06 16:26:01.005 a.out[1091:1091] PHÉP DỊCH PHẢI (n2>>2) = 2
2022-12-06 16:26:01.005 a.out[1091:1091] XOR(n1^n2) = 12
2022-12-06 16:26:01.005 a.out[1091:1091] MỘT LẦN KÈM (~n1) = -6
- Toán tử gán: Được sử dụng để gán giá trị cho một toán hạng/biến. Phía bên trái là toán hạng và phía bên phải là giá trị của toán hạng đó được gán bằng toán tử gán (=).
Phân loại | Mô tả |
= | Gán giá trị từ toán hạng bên phải cho toán hạng bên trái. |
+= | Thực hiện phép cộng toán hạng bên phải vào toán hạng bên trái và gán kết quả cho toán hạng bên trái. |
-= | Thực hiện phép trừ toán hạng bên phải cho toán hạng bên trái và gán kết quả cho toán hạng bên trái. |
*= | Thực hiện phép nhân toán hạng bên phải với toán hạng bên trái và gán kết quả cho toán hạng bên trái. |
/= | Thực hiện phép chia toán hạng bên trái cho toán hạng bên phải và gán kết quả cho toán hạng bên trái. |
%= | Thực hiện phép chia toán hạng bên trái cho toán hạng bên phải và gán kết quả tức là phần dư cho toán hạng bên trái. |
<<= | Toán tử dịch chuyển trái và gán. |
>>= | Toán tử dịch chuyển và gán phải. |
&= | Toán tử gán bit AND &. |
Ví dụ về toán tử gán
Input
// Objective-C program of Assignment Operations
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int n1 = 20;
int n2;
// Using assignment operator
n2 = n1;
NSLog(@"ASSIGN(=)= %d\n", n2);
// Using short hand addition operator
// n1=n1+n2
n1 += n2;
NSLog(@"SHORT HAND ADDITION(+=)= %d\n", n1);
// Using short hand subtraction operator
// n1=n1-n2
n1 -= n2;
NSLog(@"SHORT HAND SUBTRACTION(-=)= %d\n", n1);
// Using short hand multiplication operator
// n1=n1*n2
n1 *= n2;
NSLog(@"SHORT HAND MULTIPLICATION= %d\n", n1);
// Using short hand division operator
// n1=n1/n2
n1 /= n2;
NSLog(@"SHORT HAND DIVISION(/=)= %d\n", n1);
n1 = 100;
// Using short hand mod operator
// n1=n1%n2
n1 %= n2;
NSLog(@"n1 MOD n2(%=)= %d\n", n1);
// Using short hand bitwise AND operator
// n1=n1&n2
n1 &= 2;
NSLog(@"SHORT HAND BITWISE AND(&=)= %d\n", n1);
// Using short hand XOR operator
// n1=n1^n2
n1 ^= 2;
NSLog(@"SHORT HAND XOR(^=)= %d\n", n1);
// Using short hand bitwise OR operator
//n1=n1|2
n1 |= 2;
NSLog(@"SHORT HAND BITWISE OR(|=)= %d\n", n1);
// Using short hand left shift operator
// n1=n1<<2
n1 <<= 2;
NSLog(@"SHORT HAND LEFT SHIFT(<<=)= %d\n", n1);
// Using short hand right shift operator
// n1=n1>>2
n1 >>= 2;
NSLog(@"SHORT HAND RIGHT SHIFT(>>=)= %d\n", n1);
[pool drain];
return 0;
}
Output
2022-12-06 16:44:09.028 a.out[4481:4481] ASSIGN(=)= 20
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND ADDITION(+=)= 40
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND SUBTRACTION(-=)= 20
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND MULTIPLICATION= 400
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND DIVISION(/=)= 20
2022-12-06 16:44:09.031 a.out[4481:4481] n1 MOD n2(%=)= 0
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND BITWISE ANS(&=)= 0
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND XOR(^=)= 2
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND BITWISE OR(|=)= 2
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND LEFT SHIFT(<<=)= 8
2022-12-06 16:44:09.031 a.out[4481:4481] SHORT HAND RIGHT SHIFT(>>=)= 2
- Toán tử đặc biệt: Do ngôn ngữ lập trình cung cấp, được sử dụng để thực hiện một tác vụ cụ thể.
Phân loại | Mô tả | Ví dụ |
Size() | Toán tử tích hợp trả về kích thước của biến. | int a=10; sizeof(a); // 4byte |
& | Trả về địa chỉ của một biến. | &a // địa chỉ của a sẽ trả về |
* | Thường được sử dụng tạo biến con trỏ (int *p) để khai báo kiểu hoặc làm toán tử giải tham chiếu (dereference) để truy cập giá trị tại địa chỉ mà con trỏ trỏ tới (*p). | số nguyên a=10; số nguyên *b = &a; |
?: | Biểu thức điều kiện. Thay thế cho câu lệnh if else đơn giản. | int number1 = 5, number2 = 10, max;// max = 10max = (number1 > number2) ? number1 : number2; |
Ví dụ về toán tử đặc biệt
Input
// Objective-C program of Misc (sizeof & ternary) Operations
// or special operators
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Initialize numbers
int num1 = 7;
int res = 0;
// Pointer variable
int *ptr;
// Printing size of num1 of type int
NSLog(@"Size of num1(int)= %d\n", sizeof(num1));
// Assigning address of num1 to the pointer variable ptr
ptr = &num1;
NSLog(@"num1 = %d\n", num1);
NSLog(@"*ptr = %d\n", *ptr);
int a = 12;
// Checking condition(a==1) with ternary operator
res = (a == 10) ? 1: 0;
NSLog(@"Answer = %d\n", res);
res = (a == 12) ? 1: 0;
NSLog(@"Answer = %d\n", res);
[pool drain];
return 0;
}
Output
2022-12-06 17:05:01.804 a.out[248:248] Size of num1(int)= 4
2022-12-06 17:05:01.805 a.out[248:248] num1 = 7
2022-12-06 17:05:01.805 a.out[248:248] *ptr = 7
2022-12-06 17:05:01.805 a.out[248:248] Answer = 0
2022-12-06 17:05:01.805 a.out[248:248] Answer = 1
Ngày 5 và 6: Học về câu lệnh và vòng lặp Objective-C
Câu lệnh trong Objective-C
Giống như mọi ngôn ngữ lập trình, Objective-C cũng có một câu lệnh điều khiển quyết định, cụ thể là câu lệnh if-else và câu lệnh switch. Các câu lệnh này giúp lập trình viên thực hiện một hoặc một tập hợp các lệnh dựa trên một điều kiện đã xác định.
- Câu lệnh If: Được sử dụng để kiểm tra điều kiện và điều hướng luồng thực thi của chương trình dựa trên kết quả của điều kiện đó.
Cú pháp
if( defined_condition )
{
statement_1;
statement_2;
statement_3;
// if the defined_condition become true,
//statement 1,2,3 will execute,
}
// if defined_condition evaluates false,
// compiler will simply ignore those statements.
Ví dụ
// Objective-C program to illustrate
// the use of IF statement.
#import <Foundation/Foundation.h>
int main() {
// Khối @autoreleasepool quản lý các đối tượng tự giải phóng trong phạm vi của
// nó. ARC sẽ tự động xử lý việc này.
@autoreleasepool {
// Declaration and Initialization of number.
int number = 8;
// Checking if the number less then 10.
if (number < 10) {
// Number is less then 10,
// means condition evaluates true.
NSLog(@"Number %d is less then 10", number);
}
NSLog(@"Value of number is %d", number);
} // Kết thúc khối @autoreleasepool, các đối tượng tạm thời sẽ được giải
// phóng.
return 0;
}
Kết quả: Number 8 is less then 10. Value of number is 8.
- Câu lệnh If-Else: Được sử dụng để thực thi khối lệnh trong if nếu điều kiện đúng và ngược lại, thực thi khối lệnh trong else nếu điều kiện sai.
Cú pháp
if( defined_condition )
{
statement_1;
statement_2;
statement_3;
// if the defined_condition become true,
// statement 1,2,3 will execute,
}
else
{
statement_4;
statement_5;
// if the defined_condition become false,
// statement 4,5 will execute,
}
Ví dụ
// Objective-C program to illustrate
// the use of IF-ELSE statement.
#import <Foundation/Foundation.h>
int main ()
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
// Declaration and Initialization of number.
int number = 8;
// Checking, is the number less then 10.
if( number % 2 == 0)
{
// number % 2 is equal to 0
// so, condition evaluates true.
NSLog(@"---> %d is a Even number.\n", number);
}
else
{
// number % 2 is not equal to 0
// so, condition evaluates false.
NSLog(@"---> %d is a Odd number.\n", number);
}
return 0;
[myPool drain];
}
Kết quả: —> 8 is a Even number
- Câu lệnh Nested if-else (if-else lồng nhau): Cấu trúc này gồm một câu lệnh if hoặc else chứa thêm các câu lệnh điều kiện if-else khác bên trong. Kiểu câu lệnh này được sử dụng để xây dựng các logic rẽ nhánh nhiều tầng, xử lý các điều kiện phức tạp tùy theo trường hợp cụ thể.
Cú pháp
if( defined_condition )
{
if(inner_Condition)
{
/// if defined_Condition and inner_condition
/// both evaluates as true, then and only then
/// statement_1 will be execute.
statement_1;
}
else
{
/// if defined_Condition evaluates as true but
/// inner_condition evaluates as false, then and only then
/// statement_2 will be execute.
statement_2;
}
}
else
{
/// if the defined_condition become false,
///statement3 will execute,
statement_3;
}
Ví dụ
// Objective-C program to illustrate
// the use of Nested IF-ELSE statement.
#import <Foundation/Foundation.h>
int main ()
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
Declaration and Initialization of number.
int num_1 = 8;
int num_2 = 2;
// Checking, is the number less then 10.
if ( num_1 % 2 == 0)
{
// If num_1 is an even number
if (num_2 % 2 == 0)
{
// If num_2 is also an even number.
NSLog(@"%d and %d both are Even number.\n", num_1, num_2);
}
else
{
// If num_1 is even but num_2 is odd
NSLog(@"%d is Even number and\n", num_1);
NSLog(@"%d is an Odd number.\n", num_2);
}
}
else
{
// If num_1 and num_2 both are Odd number
NSLog(@"%d and %d both are Odd number.\n", num_1, num_2);
}
return 0;
[myPool drain];
}
Kết quả: 8 and 2 both are Even number.
- Câu lệnh if-else if-else: Là một chuỗi các điều kiện được kiểm tra tuần tự. Nếu if đầu tiên sai, kiểm tra else if thứ nhất. Nếu kết quả là sai, tiếp tục kiểm tra else if tiếp theo (nếu có). Nếu tất cả các điều kiện trước đó đều sai, khối else cuối cùng sẽ được thực thi.
Cú pháp
if( defined_condition_A )
{
statement_1;
statement_2;
statement_3;
// if the defined_condition_A become true,
//statement 1,2,3 will execute,
}
else if (defined_condition_B )
{
statement_4;
statement_5;
// if the defined_condition_B become true,
//statement 4,5 will execute,
}
else
{
statement_6;
// if the defined_condition_A as well as
// defined_condition_B both become false,
//statement 6 will execute,
}
Ví dụ
// Objective-C program to illustrate
// the use of IF-ELSEIF-ELSE statement.
#import <Foundation/Foundation.h>
int main ()
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
// Declaration and Initialization of number.
int number = 10;
// Checking, is the number less then 10.
if (number > 0)
{
// number > 0, so
//condition evaluates true.
NSLog(@"---> %d is a Positive number.\n", number);
}
else if (number < 0)
{
// number < 0, so
// condition evaluates true.
NSLog(@"---> %d is a Negative number.\n", number);
}
else
{
// Both the above condition evaluates false.
// which means number is equal to 0.
NSLog(@"---> Value of number is %d\n", number);
}
return 0;
[myPool drain];
}
Kết quả: —> 10 is a Positive number.
- Câu lệnh Switch: Đây là một cấu trúc điều khiển, cho phép kiểm tra giá trị của một biểu thức và thực thi các khối mã tương ứng với từng trường hợp cụ thể. Câu lệnh Switch thường được thay thế cho chuỗi lệnh if-else-if dài dòng, để mã nguồn gọn gàng và dễ đọc hơn.
Cú pháp
switch (expression)
{
case value1: // statement sequence
break;
case value2: // statement sequence
break;
.
.
.
case valueN: // statement sequence
break;
default: // default statement sequence
}
Ví dụ
// Using Switch case
using System;
public class Geeks
{
public static void Main(String[] args)
{
int number = 30;
// Using Switch case
switch(number)
{
case 10:
Console.WriteLine("case 10");
break;
case 20:
Console.WriteLine("case 20");
break;
case 30:
Console.WriteLine("case 30");
break;
default:
Console.WriteLine("None matches");
break;
}
}
}
Kết quả: Case 30
- Câu lệnh Switch lồng nhau (Nested Switch): Đặt một câu lệnh switch bên trong một case của câu lệnh switch khác.
Cú pháp
switch(logical_expression)
{
case constant_1 :
// inner switch case
switch( logical_expression )
{
case constant_1 :
statement_1;
statement_2;
break;
case constant_2 :
statement;
break;
default :
statement_l;
}
break;
case constant_2 :
/// inner switch case
switch( logical_expression )
{
case constant_1 :
statement_1;
statement_2;
break;
case constant_2 :
statement;
break;
default :
statement_p;
}
break;
case constant_3 :
statement;
break;
case constant_4 :
statement;
break;
default :
statement_k;
/// You can make switch case inside this/defaults section also.
}
switch(logical_expression)
{
case constant_1 :
// inner switch case
switch( logical_expression )
{
case constant_1 :
statement_1;
statement_2;
break;
case constant_2 :
statement;
break;
default :
statement_l;
}
break;
case constant_2 :
/// inner switch case
switch( logical_expression )
{
case constant_1 :
statement_1;
statement_2;
break;
case constant_2 :
statement;
break;
default :
statement_p;
}
break;
case constant_3 :
statement;
break;
case constant_4 :
statement;
break;
default :
statement_k;
/// You can make switch case inside this/defaults section also.
}
switch(logical_expression)
{
case constant_1 :
// inner switch case
switch( logical_expression )
{
case constant_1 :
statement_1;
statement_2;
break;
case constant_2 :
statement;
break;
default :
statement_l;
}
break;
case constant_2 :
/// inner switch case
switch( logical_expression )
{
case constant_1 :
statement_1;
statement_2;
break;
case constant_2 :
statement;
break;
default :
statement_p;
}
break;
case constant_3 :
statement;
break;
case constant_4 :
statement;
break;
default :
statement_k;
/// You can make switch case inside this/defaults section also.
}
Ví dụ
// Objective-C program of nested switch-case statements
#import <Foundation/Foundation.h>
int main ()
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
int a = 1, b = 2;
// Outer switch-case
switch(a)
{
// if a == 1
case 1:
// Nested switch-case / inner switch-case
switch (b)
{
// if b == 2
case 2:
NSLog(@"Your choice is 2.\n");
break;
// if b == 3
case 3:
NSLog(@"Your choice is 3.\n");
break;
}
break;
// if a == 4
case 4:
NSLog(@"Your choice is 4.\n");
break;
// if a == 5
case 5:
NSLog(@"Your choice is 5.\n");
break;
default:
NSLog(@"Your choice is other than 1, 2 3, 4, 5.\n");
break;
}
return 0;
[myPool drain];
}
Kết quả:
Vòng lặp trong Objective-C
Trong Objective-C, vòng lặp là cấu trúc điều khiển cho phép thực thi một đoạn mã nhiều lần, tùy thuộc vào điều kiện nhất định. Các loại vòng lặp thường được dùng phổ biến trong Objective-C gồm:
Vòng lặp | Mô tả |
while | Kiểm tra điều kiện trước khi thực hiện khối lệnh. Nếu điều kiện đúng, khối lệnh sẽ được thực thi; quá trình này lặp lại cho đến khi điều kiện sai. |
for | Thường được sử dụng khi biết trước số lần lặp, bao gồm phần khởi tạo, điều kiện và biểu thức cập nhật. |
do…while | Đảm bảo khối lệnh được thực thi ít nhất một lần trước khi kiểm tra điều kiện. |
Vòng lặp lồng nhau | Objective-C cho phép sử dụng vòng lặp bên trong vòng lặp khác, gọi là vòng lặp lồng nhau. |
Vòng lặp vô hạn | Xảy ra khi điều kiện lặp luôn đúng. Trong Objective-C, có thể tạo vòng lặp vô hạn bằng cách bỏ qua điều kiện trong vòng lặp for. |
Ngày 7: Học các hàm trong Objective-C
Hàm là một khối mã có tên, thực hiện một nhiệm vụ cụ thể, có thể nhận tham số và trả về giá trị. Hàm giúp tổ chức mã nguồn, tránh lặp lại và tăng tính tái sử dụng. Với hàm trong Objective-C, bạn cần nắm các kiến thức sau:
- Định nghĩa hàm
Bao gồm hai phần là tiêu đề hàm và thân hàm. Tiêu đề hàm chỉ định tên, kiểu trả về và tham số của hàm. Còn lại, thân hàm chứa một tập hợp các câu lệnh xác định chức năng của hàm. Cú pháp:
return_type function_name(parameter_list)
{
// body of the function
}
Ví dụ: Định nghĩa một hàm có tên là max, hàm này lấy hai số nguyên làm tham số và trả về giá trị lớn nhất giữa chúng.
int max(int num1, int num2)
{
int result;
if (num1 > num2)
{
result = num1;
}
else
{
result = num2;
}
return result;
}
- Gọi một hàm
Để gọi một hàm, bạn chỉ cần gọi tên và đối số phù hợp. Ví dụ:
int a = 10;
int b = 20;
int c = max(a, b); // c sẽ nhận giá trị 20
- Truyền tham số: Có hai cách truyền đối số cho một hàm là truyền theo giá trị hoặc truyền theo tham chiếu.
Truyền theo giá trị (pass by value): Truyền bản sao của giá trị; thay đổi trong hàm không ảnh hưởng đến biến gốc.
Ví dụ: Đoạn mã sau định nghĩa và gọi một hàm có tên là square trả về bình phương của một số nguyên.
// Auther: Nikunj Sonigara
#include <stdio.h>
// Function declaration
int square(int x);
// Function definition
int square(int x)
{
return x * x; // return the square of x
}
int main()
{
// Function call
int a = 5;
int b = square(a);
printf("The square of %d is %d\n", a, b);
return 0;
}
Output:
Truyền theo tham chiếu (pass by reference): Truyền địa chỉ của biến; thay đổi trong hàm ảnh hưởng đến biến gốc.
Ví dụ: Đoạn mã sau định nghĩa và gọi một hàm có tên là swap để hoán đổi hai số nguyên bằng cách truyền chúng theo tham chiếu.
// Objective-C program to pass arguments
// and return values
#include <stdio.h>
// Function declaration
void swap(int *x, int *y);
// Function definition
void swap(int *x, int *y)
{
int temp;
// temp gets the value pointed by x
temp = *x;
// x gets the value pointed by y
*x = *y;
// y gets the value stored in temp
*y = temp;
}
// Driver code
int main()
{
// Function call
int a = 10;
int b = 20;
printf("Before swap: a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}
Output:
Ngày 8 và 9: Tìm hiểu lập trình hướng đối tượng (OOP) cơ bản
Objective-C là một ngôn ngữ lập trình hướng đối tượng (OOP). OOP có 4 tính chất quan trọng gồm:
- Tính đóng gói (Encapsulation): Đây là việc giấu thông tin bên trong đối tượng và chỉ có thể truy cập thông qua phương thức công khai.
- Tính kế thừa (Inheritance): Tính chất này cho phép lớp con kế thừa các thuộc tính và phương thức từ lớp cha, giúp tái sử dụng mã và mở rộng dễ dàng.
- Tính đa hình (Polymorphism): Tính chất này cho phép đối tượng có nhiều hình thái khác nhau, có nghĩa là dù cùng một phương thức nhưng ở các lớp khác nhau khi hoạt động của nó cũng khác nhau.
- Tính trừu tượng (Abstraction): Tính chất này cho phép ẩn đi những chi tiết phức tạp và chỉ cung cấp những gì cần thiết cho người dùng.
Trong lập trình hướng đối tượng, các lớp (classes) và đối tượng (objects) là những thành phần cơ bản nhất.
Lớp
Là một bản thiết kế hoặc khuôn mẫu định nghĩa các thuộc tính và hành vi của các đối tượng. Trong Objective-C, lớp được khai báo bằng từ khóa @interface và được triển khai bằng từ khóa @implementation.
Cú pháp khai báo
@interface ClassName : SuperClassName
{
// Khai báo biến thành viên
}
// Khai báo thuộc tính
// Khai báo phương thức
@end
Cú pháp triển khai
@implementation ClassName
// Triển khai phương thức
@end
Trong đó:
ClassName
: Tên của lớp.SuperClassName
: Tên của lớp cha mà lớp hiện tại kế thừa. Nếu không kế thừa lớp nào, mặc định là NSObject.
Các loại lớp thường được sử dụng trong Objective-C gồm:
- Abstract Class: Được sử dụng làm lớp cơ sở cho các lớp khác và cung cấp một tập hợp các phương thức và thuộc tính chung cho tất cả các lớp kế thừa từ lớp này. Trong Objective-C, lớp trừu tượng được định nghĩa bằng từ khóa @interface với một phương thức không có triển khai.
- Concrete Class: Cung cấp một tập hợp các phương thức và thuộc tính dành riêng cho lớp đó. Trong Objective-C, một lớp cụ thể được định nghĩa bằng từ khóa @interface với danh sách các biến thể hiện, thuộc tính và phương thức.
- Root Class: Là lớp không kế thừa từ bất kỳ lớp nào khác. Trong Objective-C, lớp gốc là NSObject, cung cấp một tập hợp các phương thức và thuộc tính chung cho tất cả các lớp trong Objective-C.
Đối tượng (Object)
Đối tượng là một thể hiện cụ thể của một lớp. Để tạo một đối tượng, bạn cần cấp phát bộ nhớ và khởi tạo nó. Trong Objective-C có các loại đối tượng sau:
- Đối tượng có thể thay đổi: Là đối tượng có giá trị có thể thay đổi sau khi được tạo. Trong Objective-C, đối tượng có thể thay đổi thường được tạo bằng tiền tố NSMutable như NSMutableString, NSMutableArray và NSMutableDictionary.
- Đối tượng bất biến: Là đối tượng có giá trị không thể thay đổi sau khi được tạo. Trong Objective-C, đối tượng bất biến thường được tạo bằng tiền tố NS như NSString, NSArray và NSDictionary.
- Đối tượng Singleton: Là đối tượng chỉ được khởi tạo một lần trong suốt vòng đời của ứng dụng. Trong Objective-C, mẫu singleton thường được triển khai bằng cách sử dụng biến tĩnh và phương thức lớp trả về thể hiện singleton.
Ngày 10 và 11: Học về mảng, chuỗi và xử lý dữ liệu
Mảng trong Objective-C là gì?
Trong Objective-C, mảng là đối tượng dùng để lưu trữ nhiều phần tử cùng lúc. Khác với mảng nguyên thuỷ, Objective-C sử dụng hai lớp để làm việc với mảng: NSArray và NSMutableArray.
- NSArray là mảng bất biến, có nghĩa là sau khi được khởi tạo, bạn không thể thay đổi nội dung của nó.
- NSMutableArray là mảng có thể thay đổi, cho phép bạn thay đổi các phần tử sau khi mảng được tạo.
Ví dụ:
Để khai báo một mảng, bạn cần chỉ định kiểu mảng cùng với tên và kích thước của mảng theo cú pháp:
type arr[size-of-array]; ví dụ: int arr[5];
- Khởi tạo một mảng
Trong Objective C, bạn có thể khởi tạo mảng từng cái một hoặc hoàn thành mảng cùng nhau (Hoặc chúng ta có thể nói nhiều giá trị cùng nhau). Để khởi tạo từng mảng một, bạn cần gán giá trị tại chỉ mục đã chỉ định.
- Khởi tạo toàn bộ mảng
Để khởi tạo toàn bộ mảng cùng nhau, bạn phải gán tất cả giá trị bằng dấu ngoặc nhọn ({}). Độ dài của dấu ngoặc nhọn bằng với kích thước của mảng, nghĩa là nếu kích thước của mảng là 10 thì dấu ngoặc nhọn chỉ lưu trữ 10 phần tử.
Ví dụ:
int ArrayName[5] = {2, 5, 7, 3, 2}
- Truy cập các phần tử mảng bằng chỉ mục
Để truy cập các phần tử mảng, bạn có thể sử dụng chỉ mục. Vì vậy, hãy viết số chỉ mục giữa các dấu ngoặc vuông sau tên mảng.
Ví dụ 1:
int rollno = roll_no_array[2];
Trong đó, bạn đang truy cập “roll no” từ mảng roll no bằng cách sử dụng chỉ mục. Một mảng luôn bắt đầu từ số không nên trong ví dụ này, bạn đang truy cập phần tử thứ ba của mảng.
Ví dụ 2:
Input
// Objective-C program to access array using index
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Roll no array declaration
int roll_no_array[] = {55, 78, 89, 99, 250};
// Accessing the array element from the roll
// no array elements is 89
int rollno = roll_no_array[2];
// Print the element
printf("Roll No is = %d ", rollno);
[pool drain];
return 0;
}
Output
Roll No is = 89
- Truy cập các phần tử mảng bằng vòng lặp
Vòng lặp là một cách rất hiệu quả để truy cập mảng vì nếu chúng ta có 100 phần tử trong mảng, thì rất khó để truy cập tất cả các phần tử thông qua chỉ mục. Vì vậy, sử dụng vòng lặp for, chúng ta có thể lặp qua từng phần tử của mảng. Chúng ta cũng có thể đảo ngược mảng bằng vòng lặp.
Ví dụ:
Input
// Objective-C program to access array using loop
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Roll no array declaration
int roll_no_array[5] = {55, 78, 89, 99, 250}, i;
// Here we are accessing the roll no using loop
printf("Roll No is = ");
for(i = 0; i < 5; i++)
printf("%d ", roll_no_array[i]);
[pool drain];
return 0;
}
Output
Roll No is = 55 78 89 99 250
Chuỗi trong Objective-C là gì?
Trong Objective-C, chuỗi là một đối tượng biểu diễn một chuỗi ký tự. Chuỗi có thể được tạo bằng một số lớp và phương thức tích hợp, cho phép bạn thao tác văn bản và thực hiện nhiều thao tác khác nhau.
Có 3 loại chuỗi thường được dùng trong Objective-C và các phương thức phổ biến gồm:
- NSString: Đây là một đối tượng bất biến biểu diễn một chuỗi ký tự. Sau khi được tạo, nó không thể thay đổi. NSString là loại chuỗi được sử dụng phổ biến nhất trong Objective-C.
Phương thức | Mô tả | Ví dụ |
rangeOfString | Tìm kiếm chuỗi con | [text rangeOfString:@”keyword”] |
stringByReplacingOccurrencesOfString:withString: | Thay thế chuỗi con | [text stringByReplacingOccurrencesOfString:@“a” withString:@“b”] |
hasPrefix: | Kiểm tra tiền tố | [url hasPrefix:@“https”] |
hasSuffix: | Kiểm tra hậu tố | [filename hasSuffix:@“.txt”] |
lowercaseString | Chuyển thành chữ thường | [name lowercaseString] |
uppercaseString | Chuyển thành chữ hoa | [name uppercaseString] |
componentsSeparatedByString: | Tách chuỗi | [csv componentsSeparatedByString:@”,”] |
- NSMutableString: Đây là đối tượng có thể thay đổi, biểu diễn một chuỗi ký tự. Có thể sửa đổi sau khi tạo và có thể thêm hoặc xóa các ký tự mới.
Các phương thức phổ biến của NSMutableString gồm:
NSMutableString *mutable = [NSMutableString stringWithString:@“Hello”];
[mutable appendString:@”, world!”]; // Thêm chuỗi
[mutable insertString:@” Objective-C” atIndex:5]; // Chèn chuỗi
[mutable deleteCharactersInRange:NSMakeRange(0, 6)]; // Xoá ký tự
[mutable replaceCharactersInRange:NSMakeRange(0, 9) withString:@“Hi”]; // Thay thế
- CFString: Đây là đối tượng Core Foundation biểu diễn một chuỗi ký tự Unicode.
Ngoài ra, Objective-C còn cung cấp một số lớp và phương thức tích hợp để tạo và thao tác chuỗi. Các phương thức được sử dụng phổ biến nhất là:
Phương thức | Mô tả |
length | Đây là phương pháp được sử dụng để tính độ dài của chuỗi. |
stringWithFormat | Được sử dụng để định dạng một chuỗi có giá trị. Các định dạng phổ biến gồm:%@: Chuỗi %d: Số nguyên%lu: Số nguyên không dấu%f: Số thực |
substringWithRange | Đây là phương pháp được sử dụng để lấy chuỗi con của chuỗi. |
isEqualToString | Đây là phương pháp được sử dụng để so sánh xem hai chuỗi có bằng nhau không. |
stringByAppendingFormat | Đây là phương pháp được sử dụng để thêm một chuỗi đã định dạng vào cuối chuỗi. |
Ví dụ 1: Tạo chuỗi bằng NSString
Input
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]){
// define string
NSString *myString = @"Hello, World!";
// print result
NSLog(@"%@", myString);
return 0;
}
Output
Ví dụ 2: Định dạng chuỗi các giá trị bằng stringWithFormat
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]){
// create a int variable
int count = 10;
// format a string with a value using stringWithFormat
NSString *myFormattedString = [NSString stringWithFormat:@"I have %d apples.", count];
// print result
NSLog(@"%@", myFormattedString);
return 0;
}
Output
Ví dụ 3: Tạo và thao tác với chuỗi trong Objective-C
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]){
// Create a string using the NSString class
NSString *myString = @"Hello, World!";
// Get the length of the string
NSUInteger length = [myString length];
// Get a substring of the string
NSString *substring = [myString substringWithRange:NSMakeRange(7, 5)];
// Compare the string to another string
BOOL isEqual = [myString isEqualToString:@"Hello, World!"];
// Create a mutable string using the NSMutableString class
NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"];
// Append a string to the end of the mutable string
[mutableString appendString:@" World!"];
// Add two strings together
NSString *string1 = @"Hello";
NSString *string2 = @"World";
NSString *result = [string1 stringByAppendingFormat:@" %@", string2];
// Print the results to the console
NSLog(@"Original string: %@", myString);
NSLog(@"Length of string: %lu", length);
NSLog(@"Substring of string: %@", substring);
NSLog(@"String is equal: %d", isEqual);
NSLog(@"Mutable string: %@", mutableString);
NSLog(@"Concatenated string: %@", result);
return 0;
}
Output
Cách xử lý tập tin trong Objective-C
Trong Objective C, xử lý tệp đạt được thông qua việc sử dụng nhiều lớp và phương thức khác nhau do khuôn khổ Foundation cung cấp. Các lớp này cung cấp giao diện cấp cao để làm việc với tệp và thư mục, trừu tượng hóa nhiều chi tiết cấp thấp liên quan đến I/O tệp.
- Kiểu và kiểu con (Types và Subtypes)
Trong Objective C, việc xử lý tệp có thể được phân loại thành hai loại: đọc và ghi (viết). Trong đó, đọc có thể được chia thành hai loại phụ: truy cập tuần tự và truy cập ngẫu nhiên; Ghi cũng có thể được chia thành hai loại phụ: ghi đè và thêm vào.
Đọc | Ghi | ||
Tuần tự | Ngẫu nhiên | Ghi đè | Thêm vào |
Truy cập tuần tự liên quan đến việc đọc dữ liệu từ một tệp theo cách tuyến tính từ đầu đến cuối. | Đọc dữ liệu từ bất kỳ vị trí nào trong tệp | Thay thế nội dung của tệp bằng dữ liệu mới | Thêm dữ liệu mới vào cuối tệp hiện có. |
Ví dụ: Cách đọc và ghi tệp trong Objective-C
#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]) {
@autoreleasepool {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = nil;
// 1. Lấy đường dẫn đến thư mục Documents của ứng dụng
// Đây là nơi an toàn và phù hợp để lưu trữ các tệp do người dùng tạo ra.
NSArray *paths = [fileManager URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask];
if ([paths count] == 0) {
NSLog(@"Không thể tìm thấy thư mục Documents.");
return 1; // Thoát với mã lỗi
}
NSURL *documentsDirectoryURL = paths[0];
NSURL *fileURL =
[documentsDirectoryURL URLByAppendingPathComponent:@"myFile.txt"];
NSString *filePath = [fileURL path]; // Lấy chuỗi đường dẫn nếu cần (một số
// API cũ hơn có thể yêu cầu)
NSLog(@"Sẽ ghi và đọc từ tệp tại: %@", filePath);
// --- Writing to a file ---
NSString *contentToWrite =
@"Hello World from a sandboxed app with error checking!";
// Ghi tệp và kiểm tra lỗi
BOOL successWrite = [contentToWrite writeToFile:filePath
atomically:YES
encoding:NSUTF8StringEncoding
error:&error];
if (successWrite) {
NSLog(@"Ghi tệp thành công!");
} else {
NSLog(@"Ghi tệp thất bại. Lỗi: %@", [error localizedDescription]);
// Bạn có thể kiểm tra error.domain và error.code để xử lý các loại lỗi cụ
// thể Ví dụ: if ([error.domain isEqualToString:NSCocoaErrorDomain] &&
// error.code == NSFileWriteNoPermissionError) { ... }
}
// Đặt lại error thành nil trước thao tác tiếp theo
error = nil;
// --- Reading from a file ---
// Đọc nội dung tệp và kiểm tra lỗi
NSString *fileContent =
[NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding
error:&error];
if (fileContent) {
NSLog(@"Đọc tệp thành công. Nội dung:");
NSLog(@"%@", fileContent);
} else {
NSLog(@"Đọc tệp thất bại. Lỗi: %@", [error localizedDescription]);
if (error) {
// Ví dụ: nếu tệp không tồn tại, bạn có thể nhận được một lỗi như:
// "The file “myFile.txt” couldn’t be opened because there is no such
// file." (NSCocoaErrorDomain, code 260)
}
}
}
return 0;
}
Trong ví dụ này, đầu tiên bạn ghi chuỗi “Hello World!” vào một tệp nằm tại “/path/to/file.txt”. Sau đó, đọc nội dung của cùng một tệp và in nó ra bảng điều khiển.
Các phương thức xử lý tệp trong Objective-C
writeToFile:atomically:encoding:error:
: Phương thức này được cung cấp bởi lớp NSString và có thể được sử dụng để ghi một chuỗi vào tệp.stringWithContentsOfFile:encoding:error:
: Phương pháp này cũng được cung cấp bởi lớp NSString và có thể được sử dụng để đọc một chuỗi từ một tệp.createDirectoryAtPath:withIntermediateDirectories:attributes:error:
: Phương pháp này được cung cấp bởi lớp NSFileManager và có thể được sử dụng để tạo thư mục.writeToFile:atomically:
: Phương thức này được cung cấp bởi lớp NSData và có thể được sử dụng để ghi dữ liệu nhị phân vào tệp.dataWithContentsOfFile:
: Phương pháp này cũng được cung cấp bởi lớp NSData và có thể được sử dụng để đọc dữ liệu nhị phân từ một tệp
Sao chép dữ liệu từ tệp này sang tệp khác
Chương trình này nhận hai đối số dòng lệnh: đường dẫn tệp nguồn và tệp đích. Nó kiểm tra sự tồn tại của tệp nguồn và khả năng tạo tệp đích. Nếu hợp lệ, chương trình dùng NSInputStream và NSOutputStream để sao chép dữ liệu. Nếu xảy ra lỗi, chương trình in thông báo lỗi và thoát với mã lỗi. Nếu thành công, nó in thông báo hoàn tất và thoát bình thường.
Ví dụ
Input
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Step 1: Check command line arguments
if (argc < 3) {
NSLog(@"Usage: %@ source_file destination_file", [NSString stringWithUTF8String:argv[0]]);
return 1;
}
// Step 2: Open source file
FILE *source_file = fopen(argv[1], "r");
if (source_file == NULL) {
NSLog(@"Error opening source file.");
return 1;
}
// Step 3: Open destination file
FILE *destination_file = fopen(argv[2], "w");
if (destination_file == NULL) {
NSLog(@"Error opening destination file.");
return 1;
}
// Step 4: Read from source file and write to destination file
char buffer[1024];
while (fgets(buffer, 1024, source_file)) {
fputs(buffer, destination_file);
}
// Step 5: Close files
fclose(source_file);
fclose(destination_file);
NSLog(@"Data copied from %@ to %@.", [NSString stringWithUTF8String:argv[1]], [NSString stringWithUTF8String:argv[2]]);
}
return 0;
}
Output
- Thêm dữ liệu vào một tệp hiện có
Chương trình nhận hai đối số dòng lệnh: đường dẫn tệp và dữ liệu cần thêm. Nó kiểm tra xem tệp có tồn tại và có thể ghi được không. Nếu hợp lệ, chương trình dùng NSFileHandle để ghi thêm dữ liệu vào cuối tệp. Nếu xảy ra lỗi, chương trình in thông báo lỗi và thoát với mã lỗi; nếu thành công, nó in thông báo hoàn tất và thoát bình thường.
Ví dụ:
Input
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Step 1: Check command line arguments
if (argc < 3) {
NSLog(@"Usage: %@ file_path data_to_append", [NSString stringWithUTF8String:argv[0]]);
return 1;
}
// Step 2: Open file in append mode
FILE *file = fopen(argv[1], "a");
if (file == NULL) {
NSLog(@"Error opening file.");
return 1;
}
// Step 3: Append data to file
fputs(argv[2], file);
// Step 4: Close file
fclose(file);
NSLog(@"Data appended to %@.", [NSString stringWithUTF8String:argv[1]]);
}
return 0;
}
Output
- Kiểm tra tập tin có tồn tại hay không và xóa nó
Chương trình nhận một đối số dòng lệnh là đường dẫn tệp cần kiểm tra. Nếu tệp tồn tại và có thể xóa được, chương trình dùng NSFileManager để xóa tệp. Nếu có lỗi, nó in thông báo lỗi và thoát với mã lỗi; nếu thành công, in thông báo hoàn tất và thoát bình thường.
Ví dụ:
Input
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Step 1: Check command line arguments
if (argc < 2) {
NSLog(@"Usage: %@ file_path", [NSString stringWithUTF8String:argv[0]]);
return 1;
}
// Step 2: Check if file exists
NSString *filePath = [NSString stringWithUTF8String:argv[1]];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
// Step 3: Delete file
NSError *error;
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (!success) {
NSLog(@"Error deleting file: %@", [error localizedDescription]);
return 1;
}
NSLog(@"File %@ deleted successfully.", filePath);
} else {
NSLog(@"File %@ does not exist.", filePath);
}
}
return 0;
}
Output
Ngày 12 đến 14: Tổng hợp kiến thức
Từ ngày thứ 12, sau khi đã nắm rõ toàn bộ kiến thức cơ bản, bạn hãy tự mình vẽ lại sơ đồ hoặc lập bảng hệ thống kiến thức mà mình đã học được. Song song đó, thực hiện các bài tập đơn giản cũng là một cách hay để bạn nhớ lâu hơn.
Một số chủ đề bài tập đơn giản mà bạn có thể thực hiện và tìm thấy hướng dẫn/giải đáp từ các nguồn trên Internet như:
- Bài tập 1: Tạo một ứng dụng iOS cơ bản hiển thị dòng chữ “Hello World”.
- Bài tập 2: Xây dựng một ứng dụng máy tính thực hiện các phép tính cơ bản như cộng, trừ, nhân, chia.
- Bài tập 3: Tạo một ứng dụng quản lý công việc với khả năng thêm, xóa và đánh dấu hoàn thành.
- Bài tập 4: Viết một chương trình in ra bảng cửu chương cho một số nguyên nhập vào.
- Bài tập 5: Xây dựng một ứng dụng lưu trữ và hiển thị thông tin cá nhân như tên, tuổi, giới tính.
Các câu hỏi thường gặp về Objective-C tutorial
Để hiểu hết Objective-C tutorial mất bao lâu?
Thời gian để hiểu hết Objective-C tutorial có thể khác nhau ở mỗi người. Trường hợp bạn đã biết và thành thạo lập trình, hiểu hết tutorial có thể mất khoảng 1 – 2 tuần với lộ trình ITviec đã đưa ra trong bài viết. Tuy nhiên, nếu là người mới bắt đầu, có thể bạn sẽ mất khoảng 3 – 4 tuần để nắm vững kiến thức và thực hành cơ bản.
Học lập trình Objective C có khó không?
Học Objective-C có thể khó đối với người mới bắt đầu, đặc biệt là do cú pháp khác biệt và sự phức tạp của hệ sinh thái đi kèm. Học Objective-C, không chỉ là học một ngôn ngữ lập trình, mà bạn còn làm quen với runtime, compiler và các framework như Cocoa/Cocoa Touch.
Cú pháp của Objective-C với dấu ngoặc vuông và dấu @ có thể gây khó khăn cho người mới bắt đầu. Ngoài ra, runtime động và các framework lớn cũng góp phần làm tăng độ khó khi học ngôn ngữ này.
Những khoá học nào dạy về Objective-C?
Để học thêm về Objective-C, bạn có thể tham khảo thêm một số khóa học sau:
Đối tượng | Tên khóa học | Mô tả khóa học |
Dành cho người mới bắt đầu | Foundations of Objective-C App Development (Coursera) | Khóa học giới thiệu cơ bản về Objective-C, bao gồm cú pháp, lập trình hướng đối tượng và sử dụng Xcode để phát triển ứng dụng iOS. |
Learn Objective C for Beginners (Code Master) | Chuỗi video giúp nắm vững các khái niệm cơ bản như biến, lớp, phương thức, quản lý bộ nhớ và ARC | |
Objective-C tutorial series (Kodeco.com) | Chuỗi video gồm các chủ đề từ kiểu dữ liệu cơ bản đến các khái niệm nâng cao như protocols, delegates và runtime. | |
Dành cho lập trình viên Swift | Objective-C for Swift Developers (Pluralsight) | Khóa học ngắn giúp lập trình viên Swift hiểu và sử dụng Objective-C trong các dự án hiện có. |
Objective-C Crash Course for Swift Developers (Udemy) | Khóa học nhanh dành cho lập trình viên Swift, tập trung vào việc viết và chuyển đổi mã giữa Swift và Objective-C. | |
Objective-C for Swift Developers (Paul Hudson) | Khóa học tăng tốc giúp lập trình viên Swift học Objective-C thông qua các dự án thực tế và so sánh cú pháp giữa hai ngôn ngữ. | |
Thực hành và chuyên sâu | iOS 11 & Objective-C – Complete Developer Course (Udemy) | Khóa học toàn diện về phát triển ứng dụng iOS 11 bằng Objective-C, bao gồm việc tạo hơn 25 ứng dụng thực tế. |
iOS 12 & Objective-C – Complete Developer Course (Udemy) | Khóa học tương tự, cập nhật cho iOS 12 và Xcode 10, giúp học viên phát triển ứng dụng và trò chơi đầy đủ tính năng. | |
Objective-C Essential Training (LinkedIn Learning) | Khóa học cung cấp kiến thức cơ bản về Objective-C, phù hợp cho người mới bắt đầu và có thể truy cập thông qua bản dùng thử miễn phí. |
Tổng kết
Với 14 ngày học theo lộ trình ITviec đã đưa ra, bạn đã đi qua những nền tảng quan trọng nhất của ngôn ngữ Objective-C. Từ những kiến thức cơ bản về biến, kiểu dữ liệu, vòng lặp, điều kiện cho đến những chủ đề nâng cao như lớp, đối tượng, thuộc tính, phương thức, mảng,…
Tuy nhiên, đừng để hành trình học tập của bạn chỉ dừng lại ở Objective-C tutorial, mà hãy tiếp tục thực hành với những dự án đơn giản, nghiên cứu thêm về UIKit, Foundation, Interface Builder trong Xcode,… để phát triển hơn nữa khả năng lập trình của mình nhé.