Techmaster Việt Nam – Học là có việc

27 tháng 06, năm trước – 6900 lượt xemObjective-C là ngôn ngữ lập trình chứa cả ngôn ngữ C. Điều này nghĩa là tất cả chúng ta hoàn toàn có thể viết cả hai loại code trong cùng một file nguồn. Thật ra, hầu hết cấu trúc ngôn ngữ cốt của Objective C là dựa vào C, chính cho nên vì thế ta cần phải có những kỹ năng và kiến thức vững chãi về C trước khi đi sâu hơn .Mô tả quan hệ của Objective-C và CMô tả quan hệ của Objective-C và CBài viết này sẽ cho bạn một cái nhìn tổng quát về lập trình C. Chúng ta sẽ nói về những chú thích, biến, toán tử, cấu trúc rẽ nhánh và lặp, cấu trúc tài liệu đơn thuần và vai trò tích hợp của con trỏ trong Objective C. Điều này sẽ cho ta kiến thức và kỹ năng vững chãi để hoàn toàn có thể liên tục với công dụng hướng đối tượng người dùng của Objective

Dòng chú thích

Có 2 cách để cho các chú thích vào trương trình C. Để có thể viết chú thích trên dòng (inline comment) thì cần hai gạch chéo ở trước và kết thúc tại dòng đó luôn. Chú thích theo dạng khối thì có thể trên nhiều dòng và cần phải viết trong /* và */. Ví dụ:

// This is an inline comment

/* This is a block comment.
   It can span multiple lines. */

Trình biên dịch hoàn toàn bỏ lỡ những dòng chú thích nên bạn hoàn toàn có thể thêm vào những thông tin chú thích bên cạnh những dòng code. Điều này rất có ích khi cần lý giải những đoạn code phức tạp, khó hiểu ; tuye nhiên, ngôn ngữ Objective C được phong cách thiết kế sao cho những dòng code rất dễ đọc dễ hiểu, nên bạn không thực sự cần phải thêm vào quá nhiều chú thích trong những ứng dụng iOS hay OS X

Các biến

Các biến có thể chứa nhiều giá trị khác nhau. Trong C, kiểu của biến là tĩnh, tức là bạn phải chỉ rõ một biến sẽ chứa giá trị kiểu nào. Để khai báo một biến, dùng cú pháp, và để gán một giá trị cho nó thì bạn dùng phép =.  Các biến là nơi có thể lưu giữ các giá trị khác nhau. Trong C, các biến phải được viết chi tiết, nghĩa là bạn phải viết hản ra lạ họ sẽ có những giá trị nào. Để có một biết, các bạn phải dùng cú phác và để đưa giá trị thì bạn cần = giá trị nào đó. Nếu bạn cần trình biên dịch hiểu một kiểu khác của biến, bạn có thể ép kiểu bằng cách thêm kiểu trong ngoặc tròn trước biến đó.

Tất cả những điều trên được chứng tỏ trong ví dụ sau đây. Ví dụ này khai báo một biến tên là odometer hoàn toàn có thể mang giá trị kiểu double. Câu lệnh ( int ) odometer ép kiểu của giá trị trong odometer sang kiểu integer. Nếu bạn paste đoạn code này vào trong file main. m trong Xcode và chạy thử chương trình, bạn sẽ thấy dòng chữ NSLog ( ) được hiển thị trong mục output

// main.m
#import 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        double odometer = 9200.8;
        int odometerAsInteger = (int)odometer;
        
        NSLog(@"You've driven %.1f miles", odometer);        // 9200.8
        NSLog(@"You've driven %d miles", odometerAsInteger); // 9200
    }
    return 0;
}

Ngoài double và int, C còn định dạng đươc nhiều những loiaj giữ liệu khác bạn hoàn toàn có thể tìm thấy tại phần Primitives, cũng như phần lý giải cho cú pháp %. 1 f và % d đã sử dụng ở trên

Hằng số

Có thể sử dụng từ khóa const để trình biên dịch biết rằng một biến không được phép biến hóa giá trị của nó. Ví dụ, định nghĩa một hằng số pi và thử đổi khác giá trị của nó, bạn sẽ gặp một lỗi biên dịch :

double const pi = 3.14159;
pi = 42001.0;               // Compiler error

Điều này thường được dùng trong những biến của hàm để thông tin cho người gọi hàm rằng họ hoàn toàn có thể chắc như đinh rằng giá trị được truyền vào sẽ không bị biến hóa .

Phép toán số học

Những kí hiệu quen thuộc +, -, *, / được dùng cho những phép toán số học cơ bản, và phép chia lấy số dư ( % ) hoàn toàn có thể dùng để trả về số dư một phép chia hai số nguyên. Tất cả được màn biểu diễn dưới đây :

NSLog(@"6 + 2 = %d",  6 + 2);    // 8
NSLog(@"6 - 2 = %d",  6 - 2);    // 4
NSLog(@"6 * 2 = %d",  6 * 2);    // 12
NSLog(@"6 / 2 = %d",  6 / 2);    // 3
NSLog(@"6 %% 2 = %d", 6 % 2);    // 0

Cần thật cẩn thận khi thực hiện các phép toán với cả số thực dấu phẩy động và số nguyên. Xem thêm ở phần Chia số nguyên.

Bạn cũng sẽ tiếp tục gặp phép toán tăng ( + + ) và giảm ( – ) trong cắc vòng lặp. Đây là những phép toán tiện ích đùng để tăng hoặc giảm 1 đơn vị chức năng. Ví dụ :

int i = 0;
NSLog(@"%d", i);    // 0
i++;
NSLog(@"%d", i);    // 1
i++;
NSLog(@"%d", i);    // 2

Cấu trúc điều kiện

C cung ứng cú pháp if tiêu chuẩn thường được thấy trong hầu hết những ngôn ngữ lập trình. Cú pháp của nó cùng với bảng trình diễn những phép toán quan hệ / logic như sau :

int modelYear = 1990;
if (modelYear < 1967) {
    NSLog(@"That car is an antique!!!");
} else if (modelYear <= 1991) {
    NSLog(@"That car is a classic!");
} else if (modelYear == 2013) {
    NSLog(@"That's a brand new car!");
} else {
    NSLog(@"There's nothing special about that car.");
}
Phép toán Mô tả
a == b Bằng
a != b Không bằng
a > b Lớn hơn
a >= b Lớn hơn hoặc bằng
a < b Nhỏ hơn
a <= b Nhỏ hơn hoặc bằng
!a Phủ định logic
a && b Logic và
a || b Logic hoặc

C cũng có cú pháp switch, tuy nhiên chỉ nhận biến số nguyên, không nhận số thực, con trỏ hoặc đối tượng người tiêu dùng Objective-C. Điều này khiến nó không mềm dẻo bằng cú pháp if trước đó .

// Switch statements (only work with integral types) 
switch (modelYear) {
    case 1987:
        NSLog(@"Your car is from 1987.");
        break;
    case 1988:
        NSLog(@"Your car is from 1988.");
        break;
    case 1989:
    case 1990:
        NSLog(@"Your car is from 1989 or 1990.");
        break;
    default:
        NSLog(@"I have no idea when your car was made.");
        break;
}

Vòng lặp

Vòng lặp while và for được dùng để duyệt qua những giá trị, và những từ khóa tương quan như break hay continue được cho phép bạn thoát khỏi vòng lặp trọn vẹn hoặc bỏ lỡ 1 vòng lặp .

int modelYear = 1990;
// While loops
int i = 0;
while (i<5) {
    if (i == 3) {
        NSLog(@"Aborting the while-loop");
        break;
    }
    NSLog(@"Current year: %d", modelYear + i);
    i++;
}
// For loops
for (int i=0; i<5; i++) {
    if (i == 3) {
        NSLog(@"Skipping a for-loop iteration");
        continue;
    }
    NSLog(@"Current year: %d", modelYear + i);
}

Mặc dù không phải là một phần của ngôn ngữ C, đây là lúc thích hợp để trình làng vòng lặp for-in. Đây là cú pháp duyệt-nhanh và là cách hiệu suất cao hơn để duyệt qua những tập hợp trong Objective-C như NSSet hay NSArray .

// For-in loops ("Fast-enumeration," specific to Objective-C)
NSArray *models = @[@"Ford", @"Honda", @"Nissan", @"Porsche"];
for (id model in models) {
    NSLog(@"%@", model);
}

Macros

Macros là một giải pháp bậc thấp để định nghĩa hằng số và là một cách viết tắt. Từ khóa # define trực tiếp ánh xạ một tên Macros với một đoạn code lan rộng ra là chuỗi những kí tự. Trước khi trình biên dịch mở màn dịch code, bộ tiền giải quyết và xử lý thay thế sửa chữa tổng thể Macros Open trong code bằng đoạn code lan rộng ra của nó. Nói cách khác, Macros chính là một giải pháp tìm-kiếm-và-thay-thế

// main.m
#import 

#define PI 3.14159
#define RAD_TO_DEG(radians) (radians * (180.0 / PI))

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        double angle = PI / 2;              // 1.570795
        NSLog(@"%f", RAD_TO_DEG(angle));    // 90.0
    }
    return 0;
}

Đoạn code này biểu diễn hai loại Macros: macros kiểu đối tượng (PI) và macros kiểu hàm (RAD_TO_DEG(radians)). Điều khác biệt duy nhất là kiểu thứ hai thì chấp nhận biến đầu vào và truyền giá trị đó vào code mở rộng

Typedef

Từ khóa typedef được cho phép bạn tạo ra những kiểu tài liệu mới hoặc định nghĩa lại những kiểu đã có. Sau khi định nghĩa kiểu unsigned char trong đoạn code dưới đây, ta hoàn toàn có thể sử dụng ColorComponent giống như sử dụng char, int, double hay bất kể kiểu nào khác :

// main.m
#import 

typedef unsigned char ColorComponent;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        ColorComponent red = 255;
        ColorComponent green = 160;
        ColorComponent blue = 0;
        NSLog(@"Your paint job is (R: %hhu, G: %hhu, B: %hhu)",
              red, green, blue);
    }
    return 0;
}

Ngoài việc làm cho code sáng nghĩa hơn, typedef thường được sử dụng để chuyển struct và enum thành một kiểu tài liệu. Điều này sẽ được lý giải trong phần tiếp theo .