20/07/2019, 09:47

Cảm nhận đầu tiên của bạn về Swift với Playgrounds

Bây giờ bạn đã xác định được mọi thứ bạn cần để bắt đầu phát triển app iOS, tôi sẽ trả lời một số câu hỏi phổ biến khác từ những người mới bắt đầu trước khi chuyển sang chủ đề mới. Có nhiều người đã hỏi tôi về những kỹ năng cần thiết đề phát triển một ứng dụng iOS. Chúng ta có thể tóm tắt qua ba ...

Bây giờ bạn đã xác định được mọi thứ bạn cần để bắt đầu phát triển app iOS, tôi sẽ trả lời một số câu hỏi phổ biến khác từ những người mới bắt đầu trước khi chuyển sang chủ đề mới. Có nhiều người đã hỏi tôi về những kỹ năng cần thiết đề phát triển một ứng dụng iOS. Chúng ta có thể tóm tắt qua ba lĩnh vực sau:

  • Học Swift: Hiện tại Swift đang là ngôn ngữ lập trình được khuyên dùng cho việc viết các ứng dụng iOS. 
  • Học Xcode: Xcode là công cụ phát triển để thiết kế ứng dụng UI, viết code Swift và xây dựng các ứng dụng. 
  • Hiểu bộ công cụ phát triển phần mềm iOS: Apple cung cấp bộ công cụ phát triển phần mềm tới cho các lập trình viên để làm cho cuộc sống của chúng ta đơn giản dễ dàng hơn. Bộ công cụ này đi kèm với một bộ các công cụ phần mềm và APIs cho phép bạn phát triển các ứng dụng iOS. Ví dụ, nếu bạn muốn hiển thị một trang web trong ứng dụng của mình thì SDK cung cấp một trình duyệt tích hợp cho phephép bạn nhúng ngay trang web đó vào ứng dụng của mình. 

 Bạn cần phải trang bị cho mình những kiến thức của ba lĩnh vực trên. Có rất nhiều thứ phải học, tuy nhiên cũng bạn không nên lo lắng quá. Bạn sẽ học những kỹ năng đó bằng cách đọc cuốn sách này thôi. 

Tôi sẽ bắt đầu bằng cách kể cho bạn một chút về lịch sử của Swift

Trong Hội nghị dành cho những nhà phát triển toàn cầu (Worldwide Developer Conference) năm 2014, Apple đã mang đến bất ngờ cho tất cả những nhà phát triển iOS bằng cách cho ra mắt một ngôn ngữ lập trình mới tên là Swift. Swift được quảng cáo là một ngôn ngữ lập trình "nhanh, hiện đại, an toàn và các tính tương tác". Ngôn ngữ này dễ học hơn và đi kèm với những tính năng giúp cho quá trình lập trình hiệu quả hơn. 

Trước khi công bố Swift, các ứng dụng iOS đều được viết chủ yếu bằng Objective-C. Ngôn ngữ này đã tồn tại hơn 20 năm và được Apple chọn làm ngôn ngữ lập trình chủ yếu để phát triển Mac và iOS. Tôi đã được nói chuyện với rất nhiều nhà phát triển iOS đầy tham vọng. Phần lớn họ đều cho rằng Objective-C rất khó học và cú pháp của nó thì hơi lạ. Nói một cách đơn giản thì code này khiến một số người mới bắt đầu sợ hãi khi học lập trình iOS. 

Việc phát hành ngôn ngữ lập trình Swift có lẽ là câu trả lời của Apple đối với những bình luận này. Cú pháp của Swift rõ ràng và dễ đọc hơn rất nhiều. Tôi đã lập trình bằng Swift kể từ lúc nó ra mắt bản beta tính đến nay cũng hơn 4 năm rồi và tôi có thể nói rằng bạn gần như được đảm bảo sẽ làm việc hiệu quả hơn khi sử dụng Swift. Nó chắc chắn sẽ tăng tốc quá trình phát triển của bạn. Một khi bạn quen với việc lập trình bằng Swift thì rất khó để bạn quay lại sử dụng Objective-C. 

Đối với tôi Swift dường như thu hút nhiều nhà phát triển web hơn hoặc thậm chí là những người mới để xây dựng ứng dụng. Nếu bạn là một nhà phát triển web có một số kinh nghiệm lập trình trên bất cứ ngôn ngữ kịch bản nào, bạn có thể tận dụng chuyên môn hiện có của mình để có thêm kiến thức về việc phát triển các ứng dụng iOS. Điều này khá dễ dàng nếu bạn chọn Swift. Như đã nói, ngay cả khi bạn hoàn toàn là người mới bắt đầu không có kinh nghiệm lập trình trước đó thì bạn vẫn sẽ tìm thấy ngôn ngữ thân thiện hơn và cảm thấy thoải mái hơn để phát triển ứng dụng với Swift. 

Tháng 6 năm2015, Apple đã công bố Swift 2 và đây là một ngôn ngữ lập trình nguồn mở. Đây là một sự kiện lớn. Kể từ đây các nhà phát triển đã tạtạo ra nhiều project nguồn mở thú vị và tuyệt vời khi sử dụng ngôn ngữ này. Không chỉ bạn mới có thể sử dụng Swift để phát triển các ứng dụng iOS mà các công ty như IBM ng cho việc viết các ứng dụng iOS. 

Học Xcode: Xcode là công cụ phát triển để thiết kế ứng dụng UI, viết code Swift và xây dựng các ứng dụng. 

Hiểu bộ công cụ phát triển phần mềm iOS: Apple cung cấp bộ công cụ phát triển phần mềm tới cho các lập trình viên để làm cho cuộc sống của chúng ta đơn giản dễ dàng hơn. Bộ công cụ này đi kèm với một bộ các công cụ phần mềm và APIs cho phép bạn phát triển các ứng dụng iOS. Ví dụ, nếu bạn muốn hiển thị một trang web trong ứng dụng của mình thì SDK cung cấp một trình duyệt tích hợp cho phephép bạn nhúng ngay trang web đó vào ứng dụng của mình. 

 Bạn cần phải trang bị cho mình những kiến thức của ba lĩnh vực trên. Có rất nhiều thứ phải học, tuy nhiên cũng bạn không nên lo lắng quá. Bạn sẽ học những kỹ năng đó bằng cách đọc cuốn sách này thôi. 

Tôi sẽ bắt đầu bằng cách kể cho bạn một chút về lịch sử của Swift

Trong Hội nghị dành cho những nhà phát triển toàn cầu (Worldwide Developer Conference) năm 2014, Apple đã mang đến bất ngờ cho tất cả những nhà phát triển iOS bằng cách cho ra mắt một ngôn ngữ lập trình mới tên là Swift. Swift được quảng cáo là một ngôn ngữ lập trình "nhanh, hiện đại, an toàn và các tính tương tác". Ngôn ngữ này dễ học hơn và đi kèm với những tính năng giúp cho quá trình lập trình hiệu quả hơn. 

Trước khi công bố Swift, các ứng dụng iOS đều được viết chủ yếu bằng Objective-C. Ngôn ngữ này đã tồn tại hơn 20 năm và được Apple chọn làm ngôn ngữ lập trình chủ yếu để phát triển Mac và iOS. Tôi đã được nói chuyện với rất nhiều nhà phát triển iOS đầy tham vọng. Phần lớn họ đều cho rằng Objective-C rất khó học và cú pháp của nó thì hơi lạ. Nói một cách đơn giản thì code này khiến một số người mới bắt đầu sợ hãi khi học lập trình iOS. 

Việc phát hành ngôn ngữ lập trình Swift có lẽ là câu trả lời của Apple đối với những bình luận này. Cú pháp của Swift rõ ràng và dễ đọc hơn rất nhiều. Tôi đã lập trình bằng Swift kể từ lúc nó ra mắt bản beta tính đến nay cũng hơn 4 năm rồi và tôi có thể nói rằng bạn gần như được đảm bảo sẽ làm việc hiệu quả hơn khi sử dụng Swift. Nó chắc chắn sẽ tăng tốc quá trình phát triển của bạn. Một khi bạn quen với việc lập trình bằng Swift thì rất khó để bạn quay lại sử dụng Objective-C. 

Đối với tôi Swift dường như thu hút nhiều nhà phát triển web hơn hoặc thậm chí là những người mới để xây dựng ứng dụng. Nếu bạn là một nhà phát triển web có một số kinh nghiệm lập trình trên bất cứ ngôn ngữ kịch bản nào, bạn có thể tận dụng chuyên môn hiện có của mình để có thêm kiến thức về việc phát triển các ứng dụng iOS. Điều này khá dễ dàng nếu bạn chọn Swift. Như đã nói, ngay cả khi bạn hoàn toàn là người mới bắt đầu không có kinh nghiệm lập trình trước đó thì bạn vẫn sẽ tìm thấy ngôn ngữ thân thiện hơn và cảm thấy thoải mái hơn để phát triển ứng dụng với Swift. 

Tháng 6 năm2015, Apple đã công bố Swift 2 và đây là một ngôn ngữ lập trình nguồn mở. Đây là một sự kiện lớn. Kể từ đây các nhà phát triển đã tạtạo ra nhiều project nguồn mở thú vị và tuyệt vời khi sử dụng ngôn ngữ này. Không chỉ bạn mới có thể sử dụng Swift để phát triển các ứng dụng iOS mà các công ty như IBM đã phát triển các web framework để tạo các ứng dụng web trong Swift. Bây giờ bạn cũng có thể chạy Swift trong Linux. 

Sau khi phát hành Swift 2, Apple đã giới thiệu Swift 3 vào tháng 6 năm 2016. Phiên bản tích hợp vào Xcode 8 của ngôn ngữ lập trình này đã được phát hành vào tháng 7 năm 2016. Đây được xem như một trong những lần công bố lớn nhất kể từ khi ra đời của ngôn ngữ này. Có rất nhiều thay đổi trong Swift 3. Các API đều được đổi tên và nhiều tính năng mới được giới thiệu. Tất cả những thay đổi này đều giúp cho ngôn ngữ này trở nên tốt hơn và giúp cho các nhà phát triển viết được nhiều đoạn code đẹp hơn. Có nghĩa là tất cả các nhà phát triển đều cần nhiều nỗ lực hơn để điểu chỉnh những project của họ đối với thay đổi đột phá này. 

Tháng 6 năm 2017, Apple tiếp tục mang đến cho chúng ta Swift 4 cùng với việc phát hành Xcode 9 với nhiều cải tiến và nâng cấp hơn nữa. Phiên bản Swift này chú trọng vào khả năng tương thích ngược. Có nghĩa là các project lý tưởng được phát triển trên Swift 3 đều có thể chạy trên Xcode 9 mà không phải thay đổi gì. Thậm chí ngay cả khi bạn phải thực hiện các thay đổi thì việc di chuyển từ Swift 3 sang 4 sẽ ít cồng kềnh hơn nhiều so với từ 2.2 sang 3. 

Năm nay, Apple chỉ phát hành một bản cập nhật nhỏ của Swift, đẩy số phiên bản của Swift lên 4.2. Tuy không phải là bản phát hành chính nhưng phiên bản này cũng đi kèm với rất nhiều tính năng ngôn ngữ để cải thiện năng suất và hiệu quả. Bạn có thể tự hỏi liệu Apple có đang làm chậm sự phát triển của Swift bằng cách phát hành một bản nâng cấp nhỏ này hay không. Thực ra, đây là một tin tốt dành cho các nhà phát triển đầy tham vọng. Nói cách khác, điều này có nghĩa là ngôn ngữ Swift đang dần trở nên ổn định và trưởng thành hơn. 

Nếu bạn là một người hoàn toàn mới, có thể bạn sẽ có hai câu hỏi trong đầu "Tại sao Swift vẫn cứ tiếp tục thay đổi?" và "Nếu vẫn tiếp tục nâng cấp thì Swift đã sẵn sàng để sử dụng hay chưa?" 

Gần như tất cả các ngôn ngữ lập trình đều thay đổi theo thời gian. Swift cũng tương tự. Các tính năng ngôn ngữ mới được thêm vào Swift hằng năm giúp nó mạnh mẽ hơn và thân thiện với các nhà phát triển hơn. Cũng gần giống với những ngôn ngữ nói của chúng ta vậy. Xem nào, ví dụ đối với tiếng Anh, nó vẫn thay đổi theo thời gian. Các từ vựng và cụm từ như freemium đều được thêm vào từ điển mỗi năm. 

"Theo thời gian mọi ngôn ngữ đều thay đổi, có thể vì rất nhiều nguyên nhân. Tiếng Anh cũng không phải ngoại lệ"

Nguồn: https://www.english.com/blog/english-language-has-changed/

Swift vẫn tiếp tục phát triển không có nghĩa là nó chưa sẵn sàng cho việc sử dụng. Thay vào đó, nếu bạn định xây dựng một ứng dụng iOS, bạn nên xây dựng nó trong Swift. Nó đã trở thành một tiêu chuẩn thực tế cho việc phát triển ứng dụng iOS. Những công ty như LinkedIn, Diolingo và Mozilla đã viết ứng dụng hoàn toàn bằng Swift từ những phiên bản đầu tiên. Kể ttừ khi ra mắt Swift 4, ngôn ngữ lập trình dần ổn định hơn, hoàn toàn sẵn sàng cho các doanh nghiệp và sử  dụng sản xuất.

Bắt đầu nhé 

Chừng đó là đủ cho phần kiến thức nền và lịch sử, bây giờ hãy bắt đầu với Swift nào. 

Để có cảm nhận đầu tiên về ngôn ngữ lập trình Swift, hãy quan sát đoạn code sau: 

Objective-C 

const int count = 10;
double price = 23.55;

NSString *firstMessage = @"Swift is awesome. ";
NSString *secondMessage = @"What do you think?";
NSString *message = [NSString stringWithFormat:@"%@%@", firstMessage, secondMessage];

NSLog(@"%@", message);

Swift

let count = 10
var price = 23.55

let firstMessage = "Swift is awesome. "
let secondMessage = "What do you think?"
var message = firstMessage + secondMessage

print(message)

Đoạn code đầu tiên được viết trong Ọective-C còn đoạn thứ hai được viết trong Swift. Bạn thích ngôn ngữ nào hơn? Tôi đoán là bạn thích chương trình trong Swift hơn, đặc biệt là khi bạn đang gặp khó khăn với cú pháp của Objective-C. Nó rõ ràng và dễ đọc hơn, không có ký hiệu @ và dấu chấm phẩy ở cuối mỗi câu. Hai câu dưới đây nối các thông điệp thứ nhất và thứ hai với nhau, tôi tin là bạn có thể đoán được nghĩa của đoạn code Swift dưới đây:

var message = firstMessage + secondMessage

nhưng lại hơi khó hiểu khi đọc đoạn code Objective-C dưới đây:

but find it a bit confusing for the Objective-C code below:

Thử nghiệm Swift trong Playgrounds

Tôi không muốn làm bạn cảm thấy tẻ nhạt khi chỉ viết các đoạn code. Không có cách khám phá việc viết code nào tốt hơn bằng việc bạn thực sự viết code. Xcode có một tính năng tích hợp tên là Playgrounds. Đây là một môi trường phát triển tương tác để những nhà phát triển thử nghiệm lập trình Swift và cho phép bạn xem kết quả code của bạn trong thời gian thực. Bạn sẽ hiểu ý của tôi và cách Swift Playgrounds hoạt động trong một thời gian nữa. 

Giả sử bạn đã cài đặt Xcode 10 (hoặc trên), khởi chạy ứng dụng (bằng cách click vào biểu tưởng Xcode trong Launchpad), bạn sẽ thấy một hộp thoại khởi động. 

Hộp thoại khởi động 

Playground là mộ loại tệp Xcode đặc biệt. Để bắt đầu, click vào "Get started with a playground". Bạn sẽ được nhắc chọn một template cho playground của mình. Vì chúng ta đang tập trung khám phá Swift trong môi trường iOS nên hãy chọn Blank dưới phần iOS để bắt đầu blank file. Click vào Next để bắt đầu. 

Tạo một tệp Playground

Khi bạn xác nhận lưu file, Xcode sẽ mở giao diện người dùng Playground. Màn hình của bạn sẽ hiển thị như thế này:

Trên khung bên trái màn hình là khu vực soạn thảo nơi bạn có thể nhập mã. Khi bạn muốn thử nghiệm code của mình và xem nó hoạt động ra sao thì hãy bấm nút Play. Playground sẽ ngay lập tức diễn giải đoạn code đấy (lên đến dòng của nút Play) và hiển thị kết quả ở bên phải. Theo mặc định, Swift Playground gồm có hai dòng mã. Như các bạn thấy, kết quả của biên str xuất hiện ngay lập tức bên phải sau khi bạn ấn nút Play ở dòng 4. 

Bây giờ chúng ta cùng nhau viết một vài đoạn code trong Playground nhé. Hãy nhớ rằng mục đích của hoạt động này là để bạn có thêm kinh nghiệm lập trình Swift và tìm hiểu những thứ cơ bản của nó. Tôi không thể nói hết tất cả các tính năng của Swift. Chúng ta chỉ tập trung vào những topic sau: 

  1. Hằng số, biến số và type inference
  2. Điều khiển lưu lượng (control flow) 
  3. Các loại bộ sưu tập như mảng (array) và dictionary 
  4. Các tùy chọn 

Đây là những topic cơ bản mà bạn cần biết về Swift. Bạn sẽ học từ các ví dụ cụ thể. Tuy nhiên, tôi khá chắc chắn là bạn sẽ hoang mang với một vài concept lập trình, đặc biệt khi bạn là người hoàn toàn mới học lập trình. Đừng lo, bạn sẽ thấy lời khuyên học tập của tôi trong một số phần. Chỉ cần làm theo lời khuyên của tôi và không ngừng tìm hiểu, và đừng quên nghỉ giải lao khi bế tắc là được. 

Nào bắt đầu nhé!

Các hằng số và các biến số

Các hằng số và các biến số là hai yếu tố cơ bản trong lập trình. Khái niệm của các biến số (và cả hằng số) đều giống như những gì mà các bạn học trong Toán học.  Hãy quan sát phương trình dưới đây:

x = y + 10 

Cả x và y đều là các biến số. 10 là một hằng số, tức là giá trị của nó không thay đổi. 

Trong Swift, bạn gán các biến số với keyword var và hằng số với let. Nếu bạn viết phương trình dưới dạng code thì nó sẽ như thế này:

let constant = 10
var y = 10
var x = y + constant

Viết code trên vào Playground rồi ấn nút Play ở dòng 5, bạn sẽ nhận được kết quả bên dưới:

Kết quả của phương trình

Bạn có thể chọn bất cứ tên nào cho các biến số và hằng số. Chỉ cần đảm bảo chúng có nghĩa, ví dụ bạn có thể viết lại đoạn code tương tự như sau"

let constant = 10
var number = 10
var result = number + constant

Để chắc chắn bạn hoàn toàn hiểu sự khác nhau giữa biến số và hằng số trong Swift, hãy nhập đoạn code sau để thay đổi giá trị của hằng số và số: 

constant = 20
number = 50

Sau đó ấn shift + command + enter để chạy đoạn code. Bên cạnh sử dụng nút Play, bạn có thể cùng tổ hợp phím để chạy code. 

Bạn có thể dễ dàng cài mộ giá trị mới cho hằng số và biến số, tuy nhiên ngay khi bạn thay đổi giá trị của hằng số, Xcode sẽ báo lỗi trong bảng điều khiển, ngược lại, không có vấn đề gì đối với số. 

Lỗi trong Playgrounds

Đây chính là khác nhau cơ bản giữa hằng số và biến số trong Swift. Khi một hằng số được khởi chạy với một giá trị thì bạn không thể thay đổi. Nếu bạn phải thay đổi giá trị sau khi khởi chạy thì hãy dùng biến số. 

Hiểu về type inference

Swift cung cấp cho những nhà phát triển rất nhiều tính năng để viết những đoạn code trông gọn gàng hơn. Có một tính năng được biết đến là Type Inference. Đoạn code tương tự mà chúng ta vừa thảo luận ở trên có thể được viết như sau:

let constant: Int = 10
var number: Int = 10
var result: Int = number + constant

Mỗi một biến số trong Swift đều có một loại. Từ Int sau dấu hai chấm (:) cho biết loại biến số/hằng số là một số nguyên (integer) . Nếu giá trị được lưu trữ là một số thập phân, chúng ta sử dụng loại Double.

var number: Double = 10.5

Ngoài ra còn có những loại khác như String (dữ liệu dạng văn bản) và Bool (các giá trị Boolean) (đúng/sai)

Quay trở lại Type Inference, tính năng mạnh mẽ trong Swift này cho phép bạn bỏ qua loại khi khai một biến số/ hằng số để làm cho đoạn code của bạn trông gọn gàng hơn. Trình thông dịch Swift có thể đoán ra type bằng cách kiểm tra giá trị mặc định mà bạn cung cấp. Đó cũng chính là lý do chúng ta có thể viết code như thế này:

let constant = 10
var number = 10
var result = number + constant

Giá trị cho trước (i.e. 10) là một số nguyên nên type sẽ tự động được đặt về Int. Trong Playgrounds, bạn có thể giữ phím Tùy chọn và nhấp vào bất kỳ tên biến nào để hiển thị loại biến. 

Giữ phím Tùy chọn và chọn biến số để hiển thị loại biến

Chắc hẳn bạn đang thấy choáng ngợp với tất cả những khái niệm lập trình mới đúng không?

Giải lao một chút nào, bạn không cần phải đọc hết chương này mà không cần nghỉ đâu. Thậm chí bạn còn có thể bỏ qua chương này và đọc chương tiếp theo nếu không cần thiết phải xây dựng app đầu tiên của mình. Hoặc bạn luôn luôn có thể quay trở lại chương này để tìm hiểu lại những kiến thức cơ bản của Swift. 

Làm việc với Text 

Cho đến nay chúng ta mới chỉ làm việc với các biến số của hai loại Int và Double. Để lưu trữ dữ liệu văn bản dưới dạng các biến số, Swift đã cung cấp thêm một loại nữa tên là là String. Để khai một biến số của loại String này, bạn dùng phím var, đặt tên cho biến số và gán biến số với văn bản ban đầu. Văn bản được chỉ định đặt trong dấu ngoặc kép ("). Ví dụ:

var message = "The best way to get started is to stop talking and code."

Sau khi nhập dòng code trên vào Playgrounds và nhấn nút Play, bạn sẽ thấy kết quả ở bên phải màn hình. 

Swift cung cấp các toán tử và các hàm (hoặc các phương thức) khác nhau để bạn thực hiện các string. Ví dụ bạn có thể dùng dấu cộng (+) để nối hai string lại với nhau:

var greeting = "Hello "
var name = "Simon"
var message = greeting + name

Thế nếu như bạn muốn chuyển toàn bộ câu thành chữ in hoa thì sao ? Swift cung cấp một phương thức tích hợp tên là uppercased() để chuyển một string thành chữ in hoa, bạn có thể nhập đoạn code sau đây để thử:

message.uppercased()

Trình chỉnh sửa của Xcode đi kèm với một tính năng hoàn thành tự động (auto-complete). Auto-complete là một tính năng rất tiện để tăng tốc code của bạn. NgaNgay khi bạn nhập mess, bạn sẽ thấy một cửa sổ auto-complete hiển thị một số gợi ý dựa trên những gì bạn đã nhập trước đó. Tất cả những gì bạn cần phải làm là chọn message và ấn enter. 

Swift dùng cú pháp chấm để truy cập các phương thức tích hợp và các thuộc tính của một biến số. Khi bạn nhập dấu chấm sau message, cửa sổ cuto-complete nhảy lên lần nữa. Nó gợi ý một loạt các phương thức và thuộc tính có thể truy cập bằng biến số. Bạn có thể tiếp tục nhập uppercase() hoặc chọn từ cửa sổ auto-complete. 

Khi bạn nhập xong thì kết quả sẽ hiển thị ngay lập tức. Khi chúng ta dùng uppercased() trên message, nội dung của message được tự động chuyển sang dạng in hoa. 

uppercased() chỉ là một trong rất nhiều hàm tích hợp của string. Bạn có thể thử dùng lowercased() để chuyển đoạn message sang chữ in thường. 

message.lowercased()

Hoặc nếu muốn đếm số lượng ký tự của string thì bạn có thể viết code như sau:

message.count

Việc này dễ phải không? Bạn chỉ cần cộng hai string vào với nhau bằng cách dùng dấu cộng (+). Tuy nhiên không phải lúc nào cũng dễ dàng như thế, hãy thử viết đoạn code sau trong Playgrounds:

var bookPrice = 39
var numOfCopies = 5
var totalPrice = bookPrice * numOfCopies
var totalPriceMessage = "The price of the book is $" + totalPrice

Chúng ta tạo ra một string bao gồm cả một string và một số trong đó khá dễ dàng. Trong ví dụ trên, chúng ta tính tổng giá trị của sách và tạo ra một message hiển thị tổng giá cho người dùng. Nếu bạn nhập code này trong Playgrounds thì bạn sẽ thấy thông báo lỗi. 

Khi Xcode tìm thấy lỗ trong đoạn code của bạn, lỗi đó sẽ được hiển thị bằng một dấu chấm than màu đỏ cùng một thông báo lỗi ngắn. Có đôi khi Xcode sẽ hiển thị một số cách chữa lỗi khả dụng nhưng có những lúc lại không.

Bạn có thể xem khu vực/bảng gỡ lỗi để biết chi tiết về lỗi. Nếu bảng gỡ lỗi không hiển thị trong Playground thì hãy click vào nút debug area ở trên góc phải màn hình. 

Trước khi tôi chỉ cho bạn phương pháp giải quyết thì bạn có biết về sao code không hoạt động không? Dành một vài phút để suy nghĩ về điều đó nhé. 

Đầu tiên, luôn ghi nhớ rằng Swift là một ngôn ngữ an toàn. Có nghĩa là mỗi biến số đều có một type mà được chỉ định nó có thể lưu trữ loại giá trị nào. Vậy type của totalPrice là gì? Từ những điều chúng ta đã học trước đó, Swift có thể xác định type của biến bằng cách kiểm tra giá trị của biến. 

Vì 39 là một số nguyên nên Swift xác định rằng bookPrice có một type của Int, numOfCopies và totalPrice cũng vậy. 

Thông báo lỗi được hiển thị trên bảng gỡ lỗi nhắc đến việc toán tử + không thể ghép một biến string với một biến Int. Chúng phải có cùng type. Nói cách khác, bạn phải chuyển totalPrice từ Int sang String mới đúng. 

Bạn có thể viết đoạn code như thế này bằng cách chuyển số nguyên sang một string:

var totalPriceMessage = "The price of the book is $" + String(totalPrice)

Có một cách thay thế tên là String Interpolations. Bạn có thể viết code như thế này để tạo biến totalPriceMessage:

var totalPriceMessage = "The price of the book is $ (totalPrice)"

String interpolations là một cách được đề xuất để xây dựng một string từ các type khác. Đoạn biến string được đặt trong dấu ngoặc đơn thêm vào một dấu gạch chéo ngược. 

Sau khi thay đổi hãy ấn nút Play để chạy lại đoạn code. Lỗi lúc này sẽ được khắc phục. 

Những điều cơ bản về control flow 

Mỗi ngày chúng ta đều có rất nhiều quyết định. Những quyết định khác nhau lại dẫn đến những kết quả hoặc hành động khác nhau. Ví dụ, bạn quyết định nếu bạn có thể thức dậy vào 6h sáng ngày mai, bạn có thể tự nấu bữa sáng, nếu không thì bạn sẽ ăn sáng ở ngoài. 

Khi viết các chương trình, bạn sử dụng các câu lệnh if-then và if-then-else để kiểm tra điều kiện và xác định điều cần làm tiếp theo. Nếu bạn thử chạy ví dụ trên trong code, nó sẽ như sau:

var timeYouWakeUp = 6

if timeYouWakeUp == 6 {
    print("Cook yourself a big breakfast!")
} else {
    print("Go out for breakfast")
}

Bạn khai một biến timeYouWakeUp để lưu lại thời gian (trong 24 giờ) mà bạn thức giấc. Dùng câu lệnh if để đánh giá điều kiện và xác định bước tiếp theo. Điều kiện được đặt sau phím if. Chúng ta so sánh giá trị của timeYouWakeUp để xem nó có bằng 6 hay không. Toán tử == được dùng khi so sánh. 

Nếu timeYouWakeUp khớp với 6, hoạt động (hoặc câu lệnh) được đặt trong ngoặc nhọn sẽ đực thực hiện. Trong code, chúng ta thường dùng hàm print để in một tới bảng điều khiển. 

Nếu không, các câu lệnh trong else sẽ chạy để in một thông báo khác. 

Ví dụ của câu lệnh If

Trong Playgrounds bạn sẽ thấy thông báo "Cook yourself a big breakfasts!" trên bảng điều khiển vì giá trị của timeYouWakeUp nhận là 6. Bạn có thể thử thay đổi sang một giá trị khác và xem kết quả. 

Logic điều kkiện rất quan trọng trong lập trình. Tưởng tượng bạn đang phát triển một màn hình đăng nhập yêu cầu người dùng phải nhập username và mật khẩu. Người dùng chỉ có thể đăng nhập app bằng một tài khoản hợp lệ. Trường hợp này bạn có thể dùng câu lệnh if-else để xác minh tên người dùng/mật khẩu. 

Câu lệnh if-else là một trong những cách có trong Swift để kiểm soát flow của chương trình. Swift còn cung cấp câu lệnh switch để kiểm soát đoạn code nào chạy. Bạn có thể viết lại ví dụ trên sử dụng switch như sau:

var timeYouWakeUp = 6

switch timeYouWakeUp {
case 6:
    print("Cook yourself a big breakfast!")
default:
    print("Go out for breakfast")
}

Nó sẽ đạt được kết quả tương tự nếu timeYouWakeUp được đặt bằng 6. Câu lệnh switch xem xét một giá trị (ở đây là giá trị của timYouWakeUp) và so sánh với giá trị được chỉ định trong case. Trường hợp mặc định được chỉ bằng phím default. Nó rất giống với khối else trong câu lệnh if-else. Nếu giá trị ước tính không khớp với bất kỳ trường hợp nào thì trường hợp mặc định sẽ được thực hiện. Nên nếu bạn thay đổi giá trị của timYouWakeUp sang 8, nó sẽ hiển thị thông báo "Go out for breakfast" 

Không có quy tắc chung về việc khi nào dùng if-else và khi nào dùng switch. Đôi khi chúng ta thích cách này hơn cái kia chỉ vì nó dễ đọc. Giả sử bạn thường nhận được tiền thưởng cuối năm và bây giờ bạn đang lên kế hoạch cho chuyến du lịch sắp tới như sau:

  • Nếu bạn nhận được 10000 $ tiền thưởng (hoặc hơn), bán sẽ du lịch Paris hoặc London
  • Nếu bạn nhận được khoảng 5000$ đến 9999$, bạn sẽ đến Tokyo
  • Nếu bạn nhận được khoảng 1000$ đến 4999$, bạn sẽ đi Băng Cốc
  • If bạn nhận được ít hơn 1000$, bạn chỉ ở nhà không đi đâu hết. 

Nếu viết kế hoạch trên  bằng code thì nó sẽ như sau:

var bonus = 5000

if bonus >= 10000 {
    print("I will travel to Paris and London!")
} else if bonus >= 5000 && bonus < 10000 {
    print("I will travel to Tokyo")
} else if bonus >= 1000 && bonus < 5000 {
    print("I will travel to Bangkok")
} else {
    print("Just stay home")
}

 >= là một toán tử so sánh chỉ ra "tốt hơn hoặc bằng với" Điều kiện if đầu tiên kiểm tra liệu giá trị của tiền thưởng có lớn hơn hoặc bằng 10000 hay không.  Nếu chỉ định hai điều kiện đồng thời thì bạn dùng toán tử &&. Điều kiện if thứ hai kiểm tra giá trị từ 5000 đến 9999. Phần code còn lại sẽ tự giảng giải. 

Bạn có thể viết lại đoạn code trên sử dụng câu lệnh switch như sau:

var bonus = 5000

switch bonus {
case 10000...:
    print("I will travel to Paris and London!")
case 5000...9999:
    print("I will travel to Tokyo")
case 1000...4999:
    print("I will travel to Bangkok")
default:
    print("Just stay home")
}

Swift có một toán tử về phạm vi rất tiện dụng (...) dùng để xác định một phạm vì từ giới hạn thấp đến giới hạn cao. Ví dụ, 5000...9999 xác định một giới hạn chạy từ 5000 đến 9999. Đối với trường hợp đầu tiên 10000... chỉ một giá trị lớn hơn 10000. 

Tuy cả hai đoạn code đều hoạt động giống nhau nhưng bạn thích cách nào hơn? Trường hợp này cá nhân tôi thích câu lệnh switch làm cho đoạn code gọn gàng hơn, Tuy nhiên nếu bạn thích dùng câu lệnh if để giải quyết vấn đề trên thì cũng không vấn đề gì cả. Khi bạn tiếp tục khám phá lập trình Swift, bạn sẽ hiểu khi nào thì dùng if hoặc switch. 

Hiểu về array và dictionary 

Bây giờ bạn đã có một lượng kiến thức cơ bản về các biến và control flow, tôi sẽ giới thiệu một khái niệm lập trình khác mà bạn sẽ thường xuyên phải làm việc với nó. 

Cho đến nay các biến mà mà chúng ta dùng chỉ có thể lưu một giá trị đơn. Nhắc đến các biến sử dụng trong đoạn code trước đó,  các biến bonus, timYouWakeUp và totalPriceMassage có thể giữ một giá trị đơn bất kể loại biến nào. 

Cùng xem xét ví dụ sau. Tưởng tượng bạn đang tạo một ứng dụng giá sách quản lý bộ sưu tập sách của mình. Trong chương trình bạn phải có một số biến quy tên sách:

var book1 = "Tools of Titans"
var book2 = "Rework"
var book3 = "Your Move"

Vậy có cách nào để lưu nhiều hơn một giá trị thay vì lưu một giá trị đơn trong mỗi biến hay không? 

Swift cung cấp một type bộ sưu tập tên là Array cho phép bạn lưu nhiều giá trị trong một biến. Với một array, bạn có thể lưu các tên đầu sách như:

var bookCollection = ["Tool of Titans", "Rework", "Your Move"]

Bạn cũng có thể khởi tạo một Array bằng cách viết danh sách các giá trị, được phân tách bằng dấu phẩy, nằm trong một cặp dấu ngoặc vuông. Một lần nữa, vì Swift là ngôn ngữ an toàn về type nên tất cả các giá trị phải cùng type  (ví dụ: Arr).

Truy cập các giá trị của một  có thể trông lạ nếu bạn mới bắt đầu học lập trình. Trong Swift, bạn sử dụng cú pháp đăng ký để truy cập các phần tử array . Chỉ số của mục đầu tiên bằng không. Do đó, để tham khảo mục đầu tiên của một array, bạn hãy nhập code như thế này:

bookCollection[0]

Nếu bạn nhập đoạn code trên vào Playgrounds và ấn nút Play, bạn sẽ thấy thông báo "Tool of Titans" hiển thị trên phần kết quả. 

Khi bạn khai một array là var thì bạn có thể sửa các phần của nó. Ví dụ bạn có thể thêm một item mới vào array bằng cách gọi phương thức tích hợp append như sau:

bookCollection.append("Authority")

Bây giờ array có 4 item. Vậy bạn tiết lộ tổng số item của một array bằng cách nào ? Sử dụng thuộc tính count tích hợp: 

bookCollection.count

Vậy bạn làm thế nào để in giá trị mỗi item của mỗi array lên bảng kết quả? 

Đừng vội nhìn kết quả, hãy thử suy nghĩ trước.

Ok, bạn sẽ viết code như sau:

print(bookCollection[0])
print(bookCollection[1])
print(bookCollection[2])
print(bookCollection[3])

Nó hoạt động. Nhưng có một cách khác tốt hơn. Như bạn thấy, đoạn code trên lặp đi lặp lại. Nếu array có 100 item thì sẽ khá là tẻ nhạt nếu bạn cứ gõ một trăm dòng code như vậy đúng không? Trong Swift bạn sử dụng một vòng for-in để thực hiện một task (hoặc một đoạn code) đối với một số thời gian cụ thể. Ví dụ, bạn có thể đơn giản hóa đoạn code trên như sau:

for index in 0...3 {
    print(bookCollection[index])
}

Bạn định rõ khoảng số (0...3) để lặp lăij. Trong trường hợp này, đoạn code trong vòng for được thực hiện 4 lần. Theo đó giá trị của index sẽ được thay đổi. Khi vòng for bắt đầu thực hiện đầu tiên, giá trị của index được đặt từ 0 và sẽ in bookCollecion[0]. Sau khi câu lệnh được thực hiện, giá trị của index sẽ được update lên 1 và sẽ in bookCollection[1]. Quy trình này tiếp tục cho đến hết khoảng (i.e.3). 

Vậy nếu có 10 item trong array thì sao ? Bạn có thể đổi phạm vi từ 0...3 sang 0...9. Vậy khi tổng số item lên đến 100 thì sao? Bạn sẽ đổi giới hạn sang 0...100.

Có cách chung nào để thực hiện thay vì cập nhật code mỗi lần tổng số item thay đổi hay không ?

Bạn có chú ý đến một mẫu cho tất cả những range này : 0...3, 0...9, 0...100 không?

Giới hạn trên bằng tổng số item trừ 1. Bạn có thể viết lại code như sau: 

for index in 0...bookCollection.count - 1 {
    print(bookCollection[index])
}

Bây giờ bất kể số lượng item của array là bao nhiêu thì đoạn code này vẫn hoạt động. 

Vòng lại for-in của Swift lại cung cấp một cách thay thế khác để lặp lại qua một array. Đoạn code ví dụ có thể được viết lại như sau:

for book in bookCollection {
    print(book)
}

Khi array (bookCollection) được lặp lại, item của mỗi lần lặp sẽ được đặt thành hằng số book. Khi vòng lặp được bắt đầu lần đầu tiên, item đầu tiên của bookCollection được đặt thành book. Ở vòng lặp thứ hai, item thứ hai của array sẽ được gán là book. Quy trình tiếp tục cho đến khi item cuối cùng của array hoàn thành. 

Tôi tin bây giờ bạn đã hiểu cách vòng lặp for-in hoặt động và cách bạn có thể nhắc lại một task sử dụng vòng lặp, vậy hãy thảo luận đến một collection type phổ biến khác tên là dictionary. 

Một dictionary gần giống với một array, cho phép bạn lưu nhiều giá trì trong một biến/ hằng số. Sự khác nhau chính là mỗi giá trị trong một dictionary được liên kết với một key. Thay vì xác định một item bằng cách sử dụng một index thì bạn có thể truy cập item bằng cách một key duy nhất. 

Hãy cùng tiếp tục với ví dụ về bộ sưu tập sách ban nãy. Mỗi cuốn sách có một ISBN (viết tắt của International Standard Book Number - số sách tiêu chuẩn quốc tế). Nếu bạn muốn index mỗi cuốn sách trong bộ sưu tập bằng ISBN của nó, bạn có thể khai và tạo một dictionary như sau:

var bookCollectionDict = ["1328683788": "Tool of Titans", "0307463745": "Rework", "1612060919": "Authority"]

Cú pháp rất giống với việc tạo một array. Tất cả các giá trị được đặt trong dấu ngoặc vuông, key và cặp giá trị được phân cách bằng dấu hai chấm (:). Trong đoạn code ví dụ, key chính là ISBN. Mỗi tên của một cuốn sách đều được liên kết với một ISBN duy nhất. 

Vậy làm thế nào để bạn có thể truy cập một item cụ thể? NhăNhắc lại lần nữa nó rất giống với array. Tuy nhiên thay vì dùng index số thì bạn hãy dùng key duy nhất. Ví dụ:

onDict["0307463745"]

Nó trả lại cho bạn giá trị Tool of Titans. Để lặp lại hết tất cả item của dictionary hãy dùng vòng lặp for-in:

Như tiết lộ từ thông báo trong bảng điều khiển, thứ tự của các item không theo thứ tự trong khởi tạo. Không giống như một array, đây là một đăcđặc điểm của dictionary có thể lưu nhiều item trong một kiểu không thứ tự. 

Bạn có thể tự hỏi khi nào bạn cần một dictionary khi xây dựng một app. Hãy xem một ví dụ khác. Đây chính là lý do tại sao nó được biết đến là một dictionary (từ điển). Nghĩ xem bạn dùng một quyển từ điển như thế nào, bạn tìm một từ trong một cuốn từ điển và nó cung cấp cho bạn nghĩa của từ đó. Trong trường hợp này từ chính là kekey còn nghĩa của nó là giá trị liên kết. 

Trước khi chuyển sang phần tiếp theo, cùng thực hành một chút về việc tạo một Emoji dictionary nhé. Để đơn giản, từ điển này có nghĩa của những emoji sau:

  • Ghost
  • Poop
  • Angry
  • Scream
  • Alien monster 

 Bạn có biết cách thực hiện từ điển cảm xúc này bằng cách dùng dictionary type không?

Dưới đây là khung code cơ bản của emoji dictionary, hãy điền vào những đoạn code còn thiếu để nó có thể hoạt động :

var emojiDict = // Fill in the code for initializing the dictionary //

var wordToLookup = // Fill in the Ghost emoji //
var meaning = // Fill in the code for accessing the value //

wordToLookup = // Fill in the Angry emoji //
meaning = // Fill in the code for accessing the value //

Để nhập ký tự biểu tượng cảm xúc trên máy Mac, hãy nhấn control-lệnh + dấu cách.

Bạn có thể hoàn thành bài tập không ?

Chúng ta hãy xem giải pháp và đầu ra trong hình 2-16.

Tôi tin rằng bạn có thể tự mình tìm ra đáp.

Bây giờ, hãy thêm một vài dòng để in ý nghĩa của biến vào bảng điều khiển. 

Bạn hãy chú ý hai điều:

  1. Xcode chỉ ra cả hai câu lệnh in đều có vấn đề 
  2. Kết quả ở bảng điều khiến trông khác một chút với kết quả khác chúng ta đã làm trước đó. Kết quả là đúng, nhưng Optional nghĩa là gì?

 Note: Trong Xcode, cảnh báo có màu vàng. Một điểm khác nhau chính giữa cảnh báo và lỗi là chương trình của bạn vẫn có thể chạy khi có cảnh báo. Như tên cho thấy, một cảnh báo cho thấy một thông báo nâng cao của một vài vấn đề. Bạn tốt hơn hết nên khắc phục cảnh báo để tránh bất cứ vấn đề tiềm tàng nào khác. 

Cả hai vấn đề liên quan đến một concept mới trong Swift đều được gọi là Optionals. Ngay cả khi bạn có vài kiến thức nền về lập trình thì concept này có thể vẫn còn mới đối với bạn. 

Hiểu Optionals

Bạn có kinh nghiệm gì chưa? Bạn mở một ứng dụng, ấn vào một vài nút và đột nhiên nó gặp sự cố. Tôi khá chắc chắn là bạn đã từng gặp loại chuyện này rồi. 

Vậy tại sao một sự cố ứng dụng lại xảy ra?  Một nguyên nhân phổ biến là ứng dụng cố truy cập một biến không có giá trị trong thời gian chạy. Và sự cố xảy ra. 

Vậy có cách nào để ngăn chặn sự cố hay không?

Những ngôn ngữ lập trình khác nhau có những chiến lược khác nhau để khuyến khích các lập trình viên viết code tốt hoặc code ít lỗi nhất. Phần giới thiệu của Optional là cách của Swift để giúp các lập trình viên viết code tốt hơn, sau đó là tránh sự cố ứng dụng. 

Cho tới nay, tất cả biến số hoặc hằng số chúng ta đều làm việc với giá trị ban đầu. Đây là điều bắt buộc trong Swift. Một biến không tùy chọn đảm bảo việc có một giá trị. Nếu bạn thử khai một biến không giá trị, bạn sẽ gặp lỗ. Bạn cũng có thể thử trên Playgrounds và xem điều gì xảy ra.

Trong một vài tình huống bạn phải khai một biến không có giá trị ban đầu. Hãy tưởng tượng bạn đang phát triển một ứng dụng với một đơn đăng ký. Không phải tất cả các trường của đơn này đều bắt buộc, một số mục (như nghề nghiệp) là tùy chọn. Trong trường hợp này, biến số của những trường tự chọn này sẽ không có giá trị. 

Về mặt ký thuật, tùy chọn chỉ là môtmột type trong Swift. type này chỉ ra rằng biến số có thể có hoặc không có giá trị. Để khai một biến như một tùy chọn, bạn chỉ cần thêm một dấu chấm hỏi (?). Ví dụ:

var jobTitle: String?
0