summaryrefslogtreecommitdiffhomepage
path: root/vi-vn/objective-c-vi.html.markdown
blob: f300d52f0a72bb50228688c26aac259bb94bf618 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
---
language: Objective-C
contributors:
    - ["Eugene Yagrushkin", "www.about.me/yagrushkin"]
    - ["Yannick Loriot", "https://github.com/YannickL"]
lang: vi-vn
filename: LearnObjectiveC-vi.m
---

Objective-C là ngôn ngữ lập trình chính được sử dụng bởi Apple cho các hệ điều hành macOS, iOS và các framework tương ứng của họ, Cocoa và Cocoa Touch.
Nó là một ngôn ngữ lập trình mục đích tổng quát, hướng đối tượng có bổ sung thêm kiểu truyền thông điệp giống Smalltalk vào ngôn ngữ lập trình C.

```objective-c
// Chú thích dòng đơn bắt đầu với //

/*
Chú thích đa dòng trông như thế này.
*/

// Nhập các headers của framework Foundation với cú pháp #import
#import <Foundation/Foundation.h>
#import "MyClass.h"

// Đầu vào chương trình của bạn là một hàm gọi là
// main với một kiểu trả về kiểu integer.
int main (int argc, const char * argv[])
{
    // Tạo một autorelease pool để quản lý bộ nhớ vào chương trình
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Sử dụng hàm NSLog() để in ra các dòng lệnh vào console
    NSLog(@"Hello World!"); // Print the string "Hello World!"

    ///////////////////////////////////////
    // Kiểu & Biến (Types & Variables)
    ///////////////////////////////////////

    // Khai báo số nguyên
    int myPrimitive1  = 1;
    long myPrimitive2 = 234554664565;

    // Khai báo đối tượng
    // Đặt dấu nháy * vào trước tên biến cho khai báo đối tượng strong
    MyClass *myObject1 = nil;  // Strong
    id       myObject2 = nil;  // Weak
    // %@ là một đối tượng
    // 'miêu tả' ('desciption') là thông lệ để trình bày giá trị của các Đối tượng
    NSLog(@"%@ và %@", myObject1, [myObject2 description]); // In ra "(null) và (null)"

    // Chuỗi
    NSString *worldString = @"World";
    NSLog(@"Hello %@!", worldString); // In ra "Hello World!"

    // Ký tự literals
    NSNumber *theLetterZNumber = @'Z';
    char theLetterZ            = [theLetterZNumber charValue];
    NSLog(@"%c", theLetterZ);

    // Số nguyên literals
    NSNumber *fortyTwoNumber = @42;
    int fortyTwo             = [fortyTwoNumber intValue];
    NSLog(@"%i", fortyTwo);

    NSNumber *fortyTwoUnsignedNumber = @42U;
    unsigned int fortyTwoUnsigned    = [fortyTwoUnsignedNumber unsignedIntValue];
    NSLog(@"%u", fortyTwoUnsigned);

    NSNumber *fortyTwoShortNumber = [NSNumber numberWithShort:42];
    short fortyTwoShort           = [fortyTwoShortNumber shortValue];
    NSLog(@"%hi", fortyTwoShort);

    NSNumber *fortyTwoLongNumber = @42L;
    long fortyTwoLong            = [fortyTwoLongNumber longValue];
    NSLog(@"%li", fortyTwoLong);

    // Dấu phẩy động (floating point) literals
    NSNumber *piFloatNumber = @3.141592654F;
    float piFloat           = [piFloatNumber floatValue];
    NSLog(@"%f", piFloat);

    NSNumber *piDoubleNumber = @3.1415926535;
    double piDouble                 = [piDoubleNumber doubleValue];
    NSLog(@"%f", piDouble);

    // BOOL literals
    NSNumber *yesNumber = @YES;
    NSNumber *noNumber  = @NO;

    // Đối tượng Mảng
    NSArray *anArray      = @[@1, @2, @3, @4];
    NSNumber *thirdNumber = anArray[2];
    NSLog(@"Third number = %@", thirdNumber); // In ra "Third number = 3"

    // Đối tượng Từ điển
    NSDictionary *aDictionary = @{ @"key1" : @"value1", @"key2" : @"value2" };
    NSObject *valueObject     = aDictionary[@"A Key"];
    NSLog(@"Đối tượng = %@", valueObject); // In ra "Object = (null)"

    ///////////////////////////////////////
    // Toán Tử (Operators)
    ///////////////////////////////////////

    // Các toán tử cũng hoạt động giống như ngôn ngữ C
    // Ví dụ:
    2 + 5; // => 7
    4.2f + 5.1f; // => 9.3f
    3 == 2; // => 0 (NO)
    3 != 2; // => 1 (YES)
    1 && 1; // => 1 (Logical and)
    0 || 1; // => 1 (Logical or)
    ~0x0F; // => 0xF0 (bitwise negation)
    0x0F & 0xF0; // => 0x00 (bitwise AND)
    0x01 << 1; // => 0x02 (bitwise dịch trái (bởi 1))

    /////////////////////////////////////////////
    // Cấu Trúc Điều Khiển (Controls Structures)
    /////////////////////////////////////////////

    // Câu lệnh If-Else
    if (NO)
    {
        NSLog(@"I am never run");
    } else if (0)
    {
        NSLog(@"I am also never run");
    } else
    {
        NSLog(@"I print");
    }

    // Câu lệnh Switch
    switch (2)
    {
        case 0:
        {
            NSLog(@"I am never run");
        } break;
        case 1:
        {
            NSLog(@"I am also never run");
        } break;
        default:
        {
            NSLog(@"I print");
        } break;
    }

    // Câu lệnh vòng lặp While
    int ii = 0;
    while (ii < 4)
    {
        NSLog(@"%d,", ii++); // ii++ tăng dần, sau khi sử dụng giá trị của nó.
    } // => in ra  "0,"
      //           "1,"
      //           "2,"
      //           "3,"

    // Câu lệnh vòng lặp For
    int jj;
    for (jj=0; jj < 4; jj++)
    {
        NSLog(@"%d,", jj);
    } // => in ra  "0,"
      //           "1,"
      //           "2,"
      //           "3,"

    // Câu lệnh Foreach
    NSArray *values = @[@0, @1, @2, @3];
    for (NSNumber *value in values)
    {
        NSLog(@"%@,", value);
    } // => in ra  "0,"
      //           "1,"
      //           "2,"
      //           "3,"

    // Câu lệnh Try-Catch-Finally
    @try
    {
        // Your statements here
        @throw [NSException exceptionWithName:@"FileNotFoundException"
                            reason:@"Không Tìm Thấy Tập Tin trên Hệ Thống" userInfo:nil];
    } @catch (NSException * e)
    {
        NSLog(@"Exception: %@", e);
    } @finally
    {
        NSLog(@"Finally");
    } // => in ra  "Exception: Không Tìm Thấy Tập Tin trên Hệ Thống"
      //           "Finally"

    ///////////////////////////////////////
    // Đối Tượng (Objects)
    ///////////////////////////////////////

    // Tạo một thực thể đối tượng bằng cách phân vùng nhớ và khởi tạo đối tượng đó.
    // Một đối tượng sẽ không thật sự hoạt động cho đến khi cả 2 bước alloc] init] được hoàn thành
    MyClass *myObject = [[MyClass alloc] init];

    // Mô hình lập trình hướng đối tượng của Objective-C dựa trên việc truyền thông điệp (message)
    // và các thực thể đối tượng với nhau.
    // Trong Objective-C một đối tượng không đơn thuần gọi phương thức; nó truyền thông điệp.
    [myObject instanceMethodWithParameter:@"Steve Jobs"];

    // Dọn dẹp vùng nhớ mà bạn đã dùng ở chương trình
    [pool drain];

    // Kết thúc chương trình
    return 0;
}

///////////////////////////////////////
// Lớp và Hàm (Classes & Functions)
///////////////////////////////////////

// Khai báo lớp của bạn ở một tập tin header (MyClass.h):
// Cú pháp Khai Báo Lớp:
// @interface ClassName : ParentClassName <ImplementedProtocols>
// {
//    Khai báo biến thành viên;
// }
// -/+ (type) Khai báo method;
// @end
@interface MyClass : NSObject <MyProtocol>
{
    int count;
    id data;
    NSString *name;
}
// Ký hiệu (notation) tiện ích để tự động khởi tạo public getter và setter
@property int count;
@property (copy) NSString *name; // Sao chép đối tượng trong quá trình gán.
@property (readonly) id data;    // Chỉ khai báo phương thức getter.

// Phương thức
+/- (return type)methodSignature:(Parameter Type *)parameterName;

// dấu '+' cho phương thức lớp
+ (NSString *)classMethod;

// dấu '-' cho phương thức thực thể
- (NSString *)instanceMethodWithParameter:(NSString *)string;
- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number;

@end

// Thực thi các phương thức trong một tập tin thực thi (MyClass.m):

@implementation MyClass

// Gọi khi đối tượng được release
- (void)dealloc
{
}

// Phương thức khởi tạo (Constructors) là một cách để tạo các lớp
// Đây là phương thức khởi tạo mặc định được gọi khi đối tượng được khởi tạo
- (id)init
{
    if ((self = [super init]))
    {
        self.count = 1;
    }
    return self;
}

+ (NSString *)classMethod
{
    return [[self alloc] init];
}

- (NSString *)instanceMethodWithParameter:(NSString *)string
{
    return @"New string";
}

- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number
{
    return @42;
}

// Các phương thức được khai báo vào MyProtocol
- (void)myProtocolMethod
{
    // câu lệnh
}

@end

/*
 * Một protocol khai báo các phương thức mà có thể thực thi bởi bất kỳ lớp nào.
 * Các protocol chính chúng không phải là các lớp. Chúng chỉ đơn giản là định ra giao diện (interface)
 * mà các đối tượng khác có trách nhiệm sẽ thực thi.
 */
@protocol MyProtocol
    - (void)myProtocolMethod;
@end
```

## Xem Thêm

+ [Wikipedia Objective-C](http://en.wikipedia.org/wiki/Objective-C)

+ Apple Docs':
    + [Learning Objective-C](http://developer.apple.com/library/ios/referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/)

    + [Programming With Objective-C](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html)

    + [Object-Oriented Programming with Objective-C](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/OOP_ObjC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005149)

    + [Coding Guidelines for Cocoa](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html)

+ [iOS For High School Students: Getting Started](http://www.raywenderlich.com/5600/ios-for-high-school-students-getting-started)