Tải bản đầy đủ (.docx) (35 trang)

XÂY DỰNG ỨNG DỤNG TÌM KIẾM ĐỊA ĐIỂM TRÊN HỆ ĐIỀU HÀNH IOS

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (784.82 KB, 35 trang )

BỘ TÀI NGUYÊN VÀ MÔI TRƯỜNG HÀ NỘI
TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
*****************************

BÁO CÁO THỰC TẬP TỐT NGHIỆP
ĐỀ TÀI: XÂY DỰNG ỨNG DỤNG TÌM KIẾM ĐỊA ĐIỂM
TRÊN HỆ ĐIỀU HÀNH IOS

Cán bộ hướng dẫn
Sinh viên thực hiện
Lớp

: Vũ Hồng Công
: Đặng Nhân Anh
: ĐH2C1

HÀ NỘI – 2016


LỜI CẢM ƠN
Trên thực tế không có sự thành công nào mà không gắn liền với những sự giúp
đỡ mọi người dù ít hay nhiều, dù trực tiếp hay gián tiếp. Trong suốt thời gian học tập
nhất là trong quá trình thực tập, em đã nhận được rất nhiều sự quan tâm giúp đỡ nhiệt
tình của các thầy cô.
Em xin cảm ơn Ban giám đốc công ty Sunnet đã cho phép và tạo điều kiện
thuận lợi cho em được thực tập ở Công ty.
Em cũng xin gửi lời cảm ơn đến thầy Ts.Hà Mạnh Đào, Trưởng khoa công nghệ
thông tin, cùng các thầy cô giáo trong Khoa đã nhiệt tình giúp đỡ em trong quá trình
học tập tại trường.
Cuối cùng, em xin gửi lời cảm ơn chân thành tới gia đình và bạn bè đã luôn


giúp đỡ, động viên và tạo điều kiện tốt nhất cho em trong suốt quá trình học tập cũng
như trong cuộc sống.
Vì năng lực có hạn nên bài báo cáo của em còn nhiều hạn chế và không thể
tránh khỏi những thiếu sót, mong thầy cô và các bạn có những ý kiến đóng góp để em
có thể hoàn thiện và phát triển đề tài hơn.
Em xin chân thành cảm ơn!
Hà Nội, ngày 18 tháng 04 năm 2016


MỤC LỤC


Mở đầu

Lý do chọn chuyên đề thực tập: Xây dựng ứng dụng tìm kiếm địa điểm trên hệ
điều hành iOS.
Smartphone (điện thoại thông minh) hiện đang là vất dụng thiết yếu cho cuộc
sống của chúng ta. Có thể nói, chúng ta đang sống trong thờ kỳ mà những chiếc
Smartphone chiếm lĩnh cuộc sống của con người. Chiếc điện thoại thông minh đã trở
lên quá phổ biến, dẫn đến việc phát triển phần mềm - ứng dụng cho chúng cũng phát
triển mạnh mẽ, không ngừng nghỉ. Phát triển ứng dụng cho smart phone luôn là lựa
chọn hang đầu cho các nhà phát triển phần mềm.
Trong cuộcn sống hang ngày của chúng ta, việc tìm kiếm những địa điểm xung
quang như nhà hang, quán ăn, khu giải thì là hết sức cần thiết. Việc có một ứng dụng
giúp người dung tìm kiếm địa điểm mình cần một cách dễ dàng, tích hợp lên chiếc
điên thoại thông minh, sẽ đem đến một sự tiện lợi to lớn cho người dùng.
Từ việc nhận thấy tiềm năng to lớn của phát triển ứng dụng cho điện thoại
thông minh, kết hợp với sự cần thiết có một ứng dụng tìm kiếm địa điểm cho người
dung nên em quyết định chọn đề tài: Xây dựng ứng dụng tìm kiếm địa điểm cho hệ
điều hành iOS, kết hợp với kho dữ liệu địa điểm khổng lồ của Foursquare được cung

cấp miễn phí.
Đối tượng phạm vi và phương pháp thực hiện chuyên đề thực tập
Đối tượng thực hiện:
- Hệ điều hành iOS
-iOS SDK, X-code IDE
- Các Framework: Cocoa Touch, Foundation,..
- Ngôn ngữ lập trình Swift
- Các vấn đề liên quan đến lĩnh vực lập trình.
Phạm vi thực hiện:
- Về không gian: Thực hiện chuyên đề ở : Công ty cổ phần giải pháp CNTT và
truyền thông Sunnet.
- Về thời gian: từ 15/2/2016 đến 22/2/2016.
Phương pháp thực hiện:
4


-Nghiên cứu quy trình xây dựng 1 ứng dụng mobile, mà cụ thể ở đây là xây
dựng ứng dụng trên hdh iOS, bao gồm việc nghiên cứu ngôn ngữ lập trình Swift
-Nghiên cứu bộ iOS SDK,các hàm API để xây dựng được ứng dụng
-Nghiên cứu các Framework cốt lõi để xây dựng lên ứng dụng iOS là Cocoa
Touch, Foundation,..
-Các tài liệu do chính Apple phát hành miễn phí về ngôn ngữ lập trình Swift,
phát triển ứng dụng iOS với Cocoa,..

Mục tiêu và nội dung của chuyên đề
Mục tiêu: Nắm được cách thức xây dựng một ứng dụng trên iOS, xây dựng
một ứng dụng iOS đơn giản nhưng hoàn chỉnh
Nội dung
Thực trạng
iOS hiện là một trong những hệ điều hành phổ biến nhất trên thế giới, số lượng

thiết bị chạy iOS rất lớn, từ đó ta có thể thấy được tiềm năng khổng lồ cho các nhà
phát triển ứng dụng iOS. Thế nhưng, việc phát triển ứng dụng iOS chưa bao giờ là đơn
giả, nó đòi hỏi công sức và sự đầu tư tiền bạc của các Deverloper. Đầu tiên là thiết bị
để lập trình, nhà phát triển cần phải có một chiếc Macbook hoặc Mapro,iMac – đây là
các thiết bị chạy hệ điều hành OS X của Apple.
Tiếp đó cần phải hiểu được quy trình xây dựng một ứng dụng ios rất phức tạp,
để xây dựng ứng dụng iOS có thể dung 1 trong 2 ngôn ngữ là Objective-C và Swift,
Objetctive-C là ngôn ngữ lâu đời, được hỗ trợ nhiều từ cộng đồng, thay vào đó nó lại
có cú pháp khá dị và khó tiếp cận. Ngược lại Swift là ngôn ngữ mới và hiện đại, cú
pháp dễ hiểu, nhưng số thư viện hỗ trợ chưa được phong phú.
Sự cạnh tranh giữa các nhà phát triển ứng dụng cho iOS là rất lớn, vì nguồn thu
từ ứng dụng iOS là rất cáo so với các nền tảng khác, nên các nhà phát triển trên thế
giới ra rất đầu tư cho việc phát triển ứng dụng iOS, dẫn đến sự cạnh trạnh trên
Appstore là rất khốc liệt
Hướng giải quyết
Để phát triển ưng dụng iOS, việc đầu tư là bắt buộc. Nhà phát triền cần có một
thiết bị chạy OS X để lập trình ứng dụng và ít nhất một thiết bị chạy iOS để kiểm thử
ứng dụng. Do các thiết bị của Apple bán ra khá đắt, nên người dung có thể tận dụng
5


việc sử dụng các thiết bị cũ, đã qua sử dụng nhưng còn đáp ứng được yêu cầu để có
thể lập trình
Các tài liệu về lập trình iOS hiện tại rất phong phú, đặc biệt các tài liệu, ebook
tiếng anh được chia sẻ rât rộng rãi và miễn phí, giúp chúng ta có thể tiếp cận được với
công việc lập trình iOS dễ dàng hơn.
Nên nhắm vào các thị trường ngách, tức là các vấn đề mà các ứng dụng hiện tại
trên Appstore chưa đáp ứng được, hoặc đáp ứng chưa tốt để phát triển ứng dụng, từ đó
sẽ giảm bớt sự cạnh tranh và dễ thu hút người sử dụng. Thêm vào đó, việc đầu tư vào
UX/UI là vô cùng quan trọng. Việc có được trải nghiệm người dung tốt và một thiết kế

đẹp mặt sẽ khiến ứng dụng được người dung ưa thích hơn.

6


Chương 1: Giới thiệu về cơ sở thực tập
Công ty cổ phần giải pháp công nghệ thông tin và truyền thông SUNNET
1.1 Sơ lược về công ty
Tên giao dịch: Công ty cổ phần giải pháp CNTT và truyền thông SunNet
Ngày thành lập: 03/12/2007
Ban lãnh đạo:
Chủ Tịch HĐQT: Lê Tấn Hùng
Tổng Giám Đốc : Nguyễn Đức Đông
Giám Đốc Kỹ Thuật: Đỗ Đăng Quân
1.2 Lĩnh vực hoạt động chính
-

Sản xuất và phân phối nội dung số cho mobile.

-

Cung cấp dịch vụ trực tuyến trên mobile.

-

Tư vấn, phát triển các giải pháp doanh nghiệp.

-

Phát triển ứng dụng VoIP, truyền thông đa phương tiện, ứng dụng

trên nền Mobile, Embbed

-

Tư vấn, triển khai các giải pháp nguồn mở.

-

Gia công phần mềm.
1.3 Tôn chỉ hoạt động
Tôn chỉ hoạt động của Sunnet là: Bình đẳng- Cùng thành công -Bền vững -Lâu
dài. SunNet mong muốn thiết lập mối quan hệ bình đẳng với mọi khách hàng và đối
tác trên cơ sở hướng tới sự thành công của đôi bên, sự thành công ở đây bao hàm ý
nghĩa phát triển bền vững và lâu dài. Phương châm của Sunnet là: “Cùng phát triển,
cùng thành công”.

7


Chương 2: Kết quả thực hiện chuyên đề thực tập

Phần 1: Các thành phần của một ứng dụng iOS và ngôn ngữ Swift
2.1 Giới thiệu về hệ điều hành iOS
iOS là hệ điều hành trên các thiết bị di động của Apple. Ban đầu hệ điều hành
này chỉ được phát triển để chạy trên iPhone (gọi là iPhone OS), nhưng sau đó nó đã
được mở rộng để chạy trên các thiết bị của Apple như iPod touch, iPad và Apple TV.
Ngày 31 tháng 5, 2011, App Store của Apple chứa khoảng 500 000 ứng dụng iOS,[1]
và được tải về tổng cộng khoảng 15 tỷ lần. Trong quý 4 năm 2010, có khoảng 26%
điện thoại thông minh chạy hệ điều hành iOS
Giao diện người dùng của iOS dựa trên cơ sở thao tác bằng tay. Người dùng có

thể tương tác với hệ điều hành này thông qua rất nhiều động tác bằng tay trên màn
hình cảm ứng của các thiết bị của Apple
Phiên bản mới nhất của iOS là 9.3 ra ngày 21 tháng 3 năm 2016, dành cho các
thiết bị iPhone 4S, iPod 5, iPad 2, iPad Mini (thế hệ thứ nhất) trở lên và iPad Pro.
Hệ điều hành này được tiết lộ tại Hội nghị và Triển lãm Macworld diễn ra vào 9
tháng 1 năm 2007 và được phát hành vào tháng 9 năm đó. Khi đó, hệ điều hành này
chưa có một cái tên riêng nên chỉ đơn giản là "iPhone chạy OS X". Ban đầu, ứng dụng
bên thứ ba không được hỗ trợ. Steve Jobs đã chỉ ra rằng những nhà phát triển có thể
xây dựng các ứng dụng web mà "sẽ cư xử như những ứng dụng ban đầu trên iPhone".
Vào ngày 17 tháng 10 năm 2007, Apple thông báo một bộ phát triển phần mềm đang
được xây dựng và họ dự định sẽ đưa nó đến "tay của các nhà phát triển vào tháng 2".
Ngày 6 tháng 3 năm 2008, Apple đã phát hành bản dùng thử đầu tiên, cùng với một cái
tên mới cho hệ điều hành, đó là "iPhone OS".
2.1.1

Cấu trúc của một ứng dụng iOS

Ứng dụng iOS sử dụng pattern M-V-C. Điều đó có nghĩa là dữ liệu và business
logic được tách ra khỏi việc trình diễn dữ liệu.
Khi bắt đầu khởi động, hàm UIApplicationMain tạo ra các đối tượng cơ bản
quan trọng, và quan trọng nhất là đối tượng UIApplication. Nhiệm vụ của đối tượng
này là làm đơn giản hoá sự tương tác giữa hệ thống và các đối tượng khác trong ứng
dụng.

8


Hình 2.1 Các đối tượng cơ bản của một ứng dụng iOS

Các đối tượng cơ bản bao gồm:

UIApplication: Quản lý vòng lặp sự kiện và các hành vi mức cao khác. Thực tế
ít sử dụng đối tượng này, và thường chỉ sử dụng khi muốn truy cập đối tượng app
delegate.
App delegate: Là đối tượng có mặt trong mọi ứng dụng iOS và là duy nhất
(shared instance).
Documents và Data model: Đây là các custom objects, có thể tạo ra khi khởi
tạo ứng dụng hoặc tạo ra khi cần thiết.
Các đối tượng ViewControllers: Quản lý việc trình diễn nội dung ứng dụng
trên màn hình. Đây là các đối tượng rất quan trọng vì những màn hình của ứng dụng
iOS hầu hết là các ViewController. Một ViewController quản lý một đối tượng UIView
và tất cả các subviews của nó. Khi được trình diễn, UIViewController hiển thị các
views của nó bằng cách thêm chúng vào cửa sổ của ứng dụng (window).
Đối tựng UIWindow: Hầu hết các ứng dụng chỉ có một Window. Tuy nhiên
cũng có những ứng dụng có nhiều Window (để tạo một số hiệu ứng).
9


Vòng lặp chính:
Vòng lặp chính xử lý tất cả những event mà user tạo ra. Đối tượng
UIApplication cài đặt vòng lặp chính tại thời gian khởi động ứng dụng và sử dụng nó
để xử lý các sự kiện và cập nhật giao diện người dùng. Mặc dù một chương trình có
thể sử dụng nhiều thread nhưng vòng lặp chính luôn được chạy trên main thread. Điều
này đảm bảo việc sự kiện nào đến trước sẽ được xử lý trước đúng theo thứ tự.
Vòng lặp chính chấp nhận một số kiểu sự kiện và forward chúng tới đối tượng
tiếp nhận (được gọi là responder)
2.1.2 Các trạng thái của ứng dụng iOS
Not running: Ứng dụng chưa được khởi động hoặc bị hệ thống đóng
Inactive: Ứng dụng đang chạy ở foreground nhưng hiện tại không nhận sự kiện
(có thể đang thực hiện code). Đây là trạng thái quá độ, trước khi chuyển sang một
trạng thái khác.

Active : Ứng dụng đang chạy ở foreground (ứng dụng hiện tại đang hiển thị) và
sẽ nhận các event. Đây là trạng thái bình thường khi đang mở và sử dụng ứng dụng
Background : Ứng dụng ở trong background và đang thực thi mã nguồn. Hầu
hết các ứng dụng đi vào trạng thái này trong thời gian ngắn trước khi bị kết thúc. Tuy
nhiên, một ứng dụng đòi hỏi thêm thời gian thực thi có thể ở lâu hơn trong trạng thái
này so với các ứng dụng khác (download, play music, etc). Một ứng dụng cũng có thể
khởi động trực tiếp để đi vào trạng thái này.
Suspended: Là trạng thái khi ứng dụng ở background nhưng không thực thi
code, chẳng hạn khi bấm vào nút Home để trở về màn hình chính của iPhone. Khi ở
trong trạng thái này, ứng dụng được duy trì trong bộ nhớ nhưng không thực thi mã
nguồn. Khi bộ nhớ sắp hết, một số ứng dụng trong trạng thái Suspended có thể bị đóng
để nhường chỗ cho ứng dụng ở Foreground.
Mỗi khi chuyển đổi trạng thái sẽ đi kèm với một lời gọi hàm trong đối tượng
App delegate. Cụ thể như sau:

10


Hình 2.2 Vòng đời của một ứng dụng iOS

*application:willFinishLaunchingWithOptions: Method đầu tiên được gọi
khi khởi động ứng dụng.
* application:didFinishLaunchingWithOptions: Cho phép thực hiện bất cứ
khởi tạo nào trước khi ứng dụng hiển thị trên màn hình.
*applicationDidBecomeActive: Được gọi trước khi ứng dụng chuẩn bị trở
thành ứng dụng foreground.
* applicationWillResignActive: Ứng dụng sẽ ra khỏi foreground.
*applicationDidEnterBackground: Ứng dụng đã ra khỏi foreground và có thể
kết thúc bất cứ lúc nào.
*applicationWillEnterForeground: Ứng dụng sẽ ra khỏi background và trở lại

foreground nhưng vẫn chưa vào trạng thái active.
* applicationWillTerminate: Được gọi khi ứng dụng bị đóng. Method này sẽ
không được gọi khi ứng dụng vào trạng thái suspended.
2.1.3 Vòng đời của UIViewController
Thường thì mỗi màn hình trong ứng dụng iOS là một UIViewController. Đây là
đối tượng cơ bản, và các ViewController khác đều phải kế thừa nó. Mỗi
UIViewController quản lý một View và các subviews của nó. Vòng đời của
UIViewController như sau:
11


Hình 2.3 Vòng đời của một UIViewController

Có thể xem điểm bắt đầu là “Does the view exist”. Từ đây một loạt các method
được gọi:
-

loadView: Thường được sử dụng trong các ứng dụng trước iOS5. Từ iOS 5 trở đi,
method này thường không được sử dụng nữa.

-

viewDidLoad: Được gọi một lần khi lần đầu tiên đối tượng view của đối tượng
UIViewController hiển thị.

-

viewWillAppear: Có thể được gọi nhiều lần tuỳ theo view đó đã tồn tại hay chưa.
Method này được gọi trước khi view hiển thị trên màn hình.


-

viewDidAppear: Tương tự viewWillAppear, có thể được gọi nhiều lần. Method này
được gọi sau khi view đã hiển thị.

-

didReceivingMemoryWarning: Khi view đã hiển thị và bộ nhớ bị sử dụng quá nhiều,
nó sẽ gọi hàm này để cảnh báo. Có thể dùng hàm này để xoá dữ liệu dư thừa.

-

viewWillDisappear/viewDidDisappear: Được gọi trước và sau khi view bị remove
khỏi màn hình.
12


-

viewDidUnload: Là method cuối cùng được gọi sau khi view đã biến mất khỏi màn
hình.
2.2

Ngôn ngữ lập trình Swift

Hình 2.4 Ngôn ngữ lập trình Swift
Swift là một ngôn ngữ lập trình mới cho phát triển ứng dụng iOS, OS X, Watch
OS,Swift có khá nhiều điểm giống với Objective C.
Swift cung cấp các kiểu cơ bản như Int cho các số nguyên, Double và Float cho
sô thực , Bool cho giá trị True hoặc False và String cho chuỗi kí tự. Swift cũng cung

cấp 3 kiểu Collection như Array, Set và Dictionary để quản lý dạng danh sách mảng.
Swift sử dụng các biến để lưu trữ và tham chiếu giá trị bởi một tên xác định.
Swift sử dụng nhiều những giá trị không thay đổi được gọi là hằng số và mạnh hơn
nhiều so với hằng số trong C. Hằng số được sử dụng giúp cho code rõ ràng và an toàn
hơn trong lúc làm việc với các giá trị mà không cần thay đổi.
Swift cũng giới thiệu các kiểu Optional để xử lý các trường hợp không có giá
trị. Optional có thể có một giá trị hoặc không có giá trị. Optional an toàn và là một
trong những tính năng mạnh mẽ nhất của Swift.
Cuối năm 2015, Swift đã chính thức được Apple mở mã nguồn. Từ thời điểm
này trở đi thì Swift bao gồm trình biên dịch, thư viện và debugger đã hoàn toàn trở
thành mã nguồn mở
Swift sẽ là mã nguồn mở theo bản quyền Apache 2.0, điều này có nghĩa là các
nhà phát triển phần mềm có thể sử dụng ngôn ngữ này theo cách họ thích thậm chí là
cho mục đích thương mại và nó hỗ trợ cho nền tảng iOS, OS X và Linux.
13


Apple cũng vừa cho ra website swift.org để hỗ trợ cho ngôn ngữ mã nguồn mở
Swift. Ở đây các developer có thể tìm thấy các nội dung, tài liệu để thực hiện một dự
án dựa trên ngôn ngữ Swift giống như Apple đang làm trên GitHub
Dưới đây là một đoạn mã của chương trình HelloWord được viết bằng Swift:

Hình 2.5 Đoạn mã lệnh viết bằng Swift
2.2.1

Cơ bản về Swift

Đầu tiên, Swift tỏ ra linh hoạt trong điều nhỏ nhất của một ngôn ngữ lập trình.
Đó là, dấu chấm phẩy. Dấu chấm phẩy được đại đa số các ngôn ngữ lập trình sử dụng
để làm ký tự kết thúc một dòng lệnh. Còn với Swift, dấu chấm phẩy vẫn với tác dụng

là kết thúc một dòng lệnh đó. Tuy nhiên, muốn hay không muốn dùng dấu chấm phẩy
đều được.
Biến và Hằng
Hằng là giá trị không được thay đổi sau khi nó được khai báo.
Biến là giá trị có thể được thay đổi bằng một giá trị khác khi cần.

14


Hằng và biến phải được khai báo trước khi sử dụng. Phải khai báo các hằng với
từ khoá là let và biến với từ khoá là var.

//Hằng số
let hangso = 10
//Biến
var bien = 20

Có thể khai báo nhiều hằng hoặc nhiều biến như sau:

//Khai báo nhiều hằng hoặc nhiều biến trên 1 dòng.
vara = 1, b = 2, c = 3

Có thể cung cấp các kiểu khi khai báo biến hoặc hằng, để rõ ràng hơn cho kiểu
giá trị. Được viết bằng dấu hai chấm và phía sau tên biến hoặc tên hằng
varxinchao:String

Ở đây có thể được đọc như sau: “khai báo biến gọi là xinchao có kiểu String”.
Như vậy ta chỉ có thể gán chuỗi kí tự vào cho biến xinchao.
Bây giờ ta có thể gán chuỗi kí tự bất kì vào cho biến xinchao:
xinchao= "HelloWorld"


Tên hằng và tên biến
Tên hằng và tên biến có thể chứa hầu hết bất kỳ character(kí tự), bao gồm cả kí tự
Unicode.
//Tên Hằng và Biến.
letπ = 3.14159
let 你好 = "你好世界"

Tên hằng và tên biến không thể chứa các kí tự khoảng trắng, ký hiệu toán học,
các mũi tên... và không thể bắt đầu bằng một con số.
15


Khi đã khai báo một hằng hoặc một biến có kiểu nhất định, không thể khai báo
lại nữa với cùng tên, hoặc thay đổi kiểu khác.
Có thể thay đổi giá trị của biến có cùng kiểu.
//Thay đổi giá trị của biến xinchao từ HelloWorld XinChao
xinchao= "XinChao"

Swift được thiết kế để trở thành một ngôn ngữ an toàn, nên chỉ cho sử dụng
biến, hằng sau khi đã khởi gán giá trị cho biến, hằng. Nếucố sử dụng biến, hằng khi nó
chưa được khởi gán thì chương trình sẽ phát sinh lỗi. Điều này là tương tự C#, khác so
với C, C++.
Kiểu dữ liệu
Swift cung cấp đầy đủ các kiểu dữ liệu cơ bản như : Int, Double, Float, Bool,
String, Character
Với Swift, tất cả các kiểu dữ liệu (ngoại trừ kiểu lớp) đều là kiểu giá trị. Duy
nhất kiểu lớp là kiểu tham chiếu. Như vậy, kiểu String, Array, Dictionary, Enum,
Structure đều là kiểu giá trị. Đây là một khác biệt rất lớn so với các ngôn ngữ khác và
nó tạo ra nhiều thuận tiện, dễ dàng trong việc xử lý cho người lập trình.

Giống C# và Java, Swift cung cấp đầy đủ các kiểu dữ liệu như Int32, UInt8,
Int16, UInt64, Double, Float,... Tuy nhiên, khi làm việc với số nguyên, nếu không
quan tâm đến kích thước vùng nhớ lắm thì nên dùng kiểu dữ liệu toàn năng được Swift
cung cấp là : Int, UInt. Các kiểu dữ liệu này là các kiểu dữ liệu thông minh, nó sẽ tự
thay đổi kích thước theo nền tảng mà đang chạy chương trình - tức là, nếu nền tảng là
32 bit thì kích thước sẽ là 32 bit, trên nền tảng 64 bit thì kích thước sẽ là 64 bit.
Swift là an toàn kiểu, nên nó sẽ không cho phép gán một số nguyên cho một
biến kiểu String, hoặc gán một ký tự (kiểu Character) cho một biến kiểu Int (như C,
C++). Swift còn an toàn hơn nữa ở chỗ, nó loại bỏ cú pháp ép kiểu ngầm định.
Swift hỗ trợ tạo bí danh cho các kiểu dữ liệu. Điều này rất hay vì nó sẽ cung
cấp các tên kiểu dữ liệu mới phù hợp hơn với ngữ cảnh. Ví dụ: dùng tên kiểu dữ liệu là
điểm để tạo các biến chứa điểm thì sẽ dễ hiểu hơn là khai báo các biến đó với kiểu dữ
liệu là UInt8.
String và kiểu ký tự
16


Điểm khác biệt đáng quan tâm nhất về String là khả năng sửa đổi (mutability).
Trong Objective C cũng như C#, các chuỗi đều là chuỗi bất di bất dịch (immutable),
có nghĩa là sau khi gán một chuỗi cho biến thì chúng ta không thể chèn thêm ký tự,
xoá ký tự, thay đổi ký tự trong chuỗi đó. Nếu muốn làm những việc như vậy, phải
dùng kiểu NSMutableString (của Objective C) hay kiểu StringBuilder (của C#). Điều
này đôi lúc gây ra sự bất tiện và làm gia tăng việc xử lý chuỗi. Còn với Swift, việc
mutable hay immutalbe được quyết định thông qua gán chuỗi cho biến hay hằng. Nếu
gán chuỗi cho hằng thì chuỗi đó là immutable và gán cho biến thì có thể sửa đổi chuỗi
đó tuỳ thích. Một cách xử lý khá là giản dị.
Như ở phần trên đã đề cập tới, String của Swift là kiểu giá trị và khi thực hiện
gán hoặc truyền tham số thì chuỗi sẽ được sao chép. Cách xử lý này gần với tự nhiên
hơn, nên người lập trình sẽ dễ dàng hơn để sử dụng. Tuy nhiên, có người sẽ bảo rằng
như vậy thì sẽ tốn hiệu năng xử lý hơn rất nhiều (vì sao chép luôn cả chuỗi như vậy

vừa tốn bộ nhớ, vừa tốn hiệu năng xử lý sao chép chuỗi). Swift đã xử lý vấn đề này
ngầm bên dưới bằng cách : đầu tiên, vẫn chỉ gán địa chỉ (không sao chép nguyên chuỗi
ra vùng nhớ khác), chỉ cho đến khi gặp dòng lệnh thực hiện sửa đổi nội dung của chuỗi
thì chuỗi đó mới được sao chép ra vùng nhớ mới và các thao tác sửa đổi được thực
hiện trên vùng nhớ này.
Có thể dùng phép toàn + để nối chuỗi, ký tự; phép toán so sánh ==, != để so
sánh hai chuỗi, hai ký tự; phép toán += để bổ sung chuỗi, ký tự vào cuối.
Kiểu dữ liệu Tuple
Kiểu tuple là một trong hai kiểu dữ liệu mới của Swift.
Kiểu tuple nhóm nhiều giá trị vào bên trong một giá trị kết hợp duy nhất. Các
giá trị trong tuple có thể thuộc bất kỳ kiểu dữ liệu nào và không cần phải giống nhau.
//Kiểu Tuple
let tuple = ("khoapham",123456)

Kiểu dữ liệu Optional
Đây là kiểu dữ liệu mới thứ hai của Swift
Ta dùng optional khi một biến (tại thời điểm nào đó trong chu trình sống của
nó) có thể không chứa giá trị nào. Khi lấy giá trị của một biến optional thì có thể nhận
được câu trả lời kiểu như : Có chứa giá trị và nó là x hoặc hoàn toàn không chứa giá trị
nào.
17


Optional gần giống như con trỏ nil (hoặc null của C#). Tuy nhiên, nil hay null
chỉ dùng với kiểu dữ liệu lớp, còn optional thì dùng với mọi kiểu dữ liệu. Có nghĩa là
ngay cả một biến kiểu Int cũng có thể có lúc không nhận được giá trị nào. Swiftcũng
dùng từ khoá nil, nhưng nó không phải là con trỏ (trong C nó là con trỏ trỏ về vùng
đầu tiên của bộ nhớ heap), nó chỉ là từ khoá để chỉ tình trạng không chứa giá trị.
Để khai báo một kiểu optional, ta thêm dấu chấm hỏi vào cuối tên kiểu dữ liệu.
Ví dụ : Int?, String?

//Optional
let optional: String? = nil
if optional == nil{
print("nil") }
//Kết quả: "nil"

Toán tử
Phép gán = không trả ra giá trị, nên không gán giá trị cho nhiều biến đồng thời
như trong C# được. Việc ngăn không cho phép gán trả ra giá trị cũng giúp các biểu
thức điều kiện đỡ phức tạp, đỡ sai sót hơn.Toán tử % có thể dùng cho cả số thực và số
âm.
Các phép toán số học (+, -, *, /) mặc định không xử lý trường hợp tràn số. Nếu
tràn số thì chương trình sẽ phát sinh lỗi.Để xử lý trường hợp tràn số, Swifthỗ trợ 5 toán
tử xử lý tình huống tràn số là &+, &-, &*, &/, &%.
2.2.2 Array và Dictionary
Giống như Objective C, Swift vẫn chỉ cung cấp hai kiểu collection là Array và
Dictionary.
Array (còn gọi là mảng) lưu trữ một danh sách có thứ tự các giá trị có cùng
kiểu. Các giá trị giống nhau có thể xuất hiện nhiều lần tại những vị trí khác nhau.
Dictionary lưu trữ một tập không thứ tự các giá trị cùng kiểu mà nó có thể được
tham chiếu và tìm kiếm thông qua một định danh duy nhất (hay còn gọi là khoá).
Dictionary chính là kiểu tập hợp Map hoặc Hashtable trong C# và các ngôn ngữ khác.
Ta dùng dictionary khi cần tìm kiếm các giá trị dựa trên định danh (khoá) của
chúng, giống như cách tìm kiếm định nghĩa của các từ trong một quyển từ điển.
Objective C chỉ cung cấp đúng hai kiểu collection này. Các kiểu collection như
List, Stack, Queue là không có. Nhưng trong XCode, người ta dùng hai kiểu này khá
linh hoạt để thay thế cho những kiểu thiếu trên. Có trường hợp khá thú vị và hay là
người ta dùng Dictionary để tổ chức dữ liệu cho các TableView. Mỗi hàng là một
18



thành phần trong Dictionary được phân biệt với nhau thông qua key là id của hàng dữ
liệu. Việc tổ chức bằng Dictionary như trên mạnh mẽ và linh hoạt hơn tổ chức bằng
Array rất nhiều.
Tương tự như kiểu string thì array và dictionary là có thể sửa đổi (mutable) khi
được chứa trong biến và không thể sửa đổi (immutable) khi được chứa trong hằng.
Điều này giải phóng người lập trình ra khỏi cái mớ bòng bong giữa NSArray và
NSMutableArray hay NSDictionary và NSMutableDictionary của Objective C.
Các thao tác thêm, sửa, xoá của Swift khá là tự nhiên. Có thể dùng phép toán
+= để thêm một hoặc vài thành phần mới vào array hoặc dictionary. Có thể dùng toán
tử phạm vi để sửa đổi cùng lúc cả nhóm các thành phần liền kề nhau.
//Array
var mang:[Int] = [1, 2, 3]
//Cách thêm phần tử cho mang
mang.append(4)
//Lấy giá trị
print("Số: \(mang[1])")
//Xoá vị trí phần tử trong mang
mang.removeAtIndex(2) //Vị trí 2 là số 3
print(mang)
//Thêm một phần tử vào mang tại vị trí nhất định
mang.insert(5, atIndex: 2)

2.2.3 Cấu trúc điều khiển
Swift cung cấp đầy đủ các câu lệnh điều khiển if, switch, for, while, do. Các
biểu thức điều kiện không cần đặt trong cặp dấu ngoặc, nhưng cặp dấu ngoặc nhọn để
bao phần thân là bắt buộc.
Các biểu thức điều kiện phải có kết quả kiểu bool. Điều này là an toàn hơn,
giống với C#, Java, nhưng khác so với C. Câu lệnh switch là câu lệnh có nhiều cải tiến
nhất trong các câu lệnh điều khiển. Câu lệnh for-in là câu lệnh mới được bổ sung trong

nhóm các câu lệnh lặp. Câu lệnh này giống câu lệnh foreach của C#, nhưng mạnh mẽ
hơn.
Swift vẫn hỗ trợ hai câu lệnh break và continue. Ngoài ra, còn hỗ trợ thêm câu
lệnh fallthrough (trong câu lệnh switch) để cho phép thực thi xuống tiếp case tiếp theo,
giống như cách làm việc của switch của các ngôn ngữ C, C++, C#.
Swifthỗ trợ một thứ gọi là labelled statement. Cái này nó giống như nhãn và
lệnh goto trong C, C++. Tuy nhiên, labelled statement được dùng trong các trường hợp
19


như : khi có nhiều vòng lặp lồng nhau, hoặc khi có các câu lệnh lặp lồng trong câu
lệnh switch,... Trong các trường hợp này, việc câu lệnh break, continue có thể xác định
được thoát ra khỏi vòng lặp, câu lệnh switch nào thì sẽ hữu dụng hơn. Như vậy cách
dùng labelled statement an toàn hơn so với lệnh goto của C, C++ rất nhiều.
//For
forindex in 0...3{
print("Hello\(index)") }
//While
var so = 0
var ketqua = 6
while so so = so + 1
print(so) }
//IF
var x = 2
if x == 2{
print("x = 2") }else{
print("x != 2") }

2.2.4 Hàm

Hàm(function) là khối mã khép kín dùng để thực hiện một tác vụ cụ thể. Cho
một tên hàm để xác định những gì nó làm, và tên này được sử dụng để “gọi” hàm để
thực hiện tác vụ khi cần thiết.
Cú pháp hàm thống nhất của Swift là đủ linh hoạt để thể hiện bất cứ điều gì từ
một hàm C-style đơn giản không có tên tham số đến một phương thức Objective-Cstyle phức tạp với các tên tham số hàm địa phương và bên ngoài cho mỗi tham số. Các
thông số có thể cung cấp các giá trị để mặc định để đơn giản hóa các cuộc gọi chức
năng và có thể được thông qua như tham số in-out, mà sửa đổi một biến được khi hàm
đã hoàn tất việc thực hiện.
Mỗi hàm trong Swift đều có một kiểu, bao gồm các kiểu tham số và kiểu trả về
của hàm. Có thể sử dụng kiểu này giống như bất kỳ kiểu nào khác trong Swift, việc
này dễ dàng để truyền vào hàm cũng như tham số cho các hàm khác, và để trả về hàm
này từ hàm khác. Hàm này cũng có thể được viết trong các hàm khác để đóng gói các
hàm hữu ích trong phạm vi hàm lồng nhau.
//Khai Báo
func say()->String{
let name = "Jobs"
return name }
//Gọi hàm
print(say())
//Kết quả: "Jobs"

20


2.2.5 Closure
Closures là những khối độc lập chứa các chức năng có thể được truyền qua và
sử dụng trong mã code của. Closures trong Swift tương tự như blocks trong C và
Object-C, và như lambas trong một số ngôn ngữ lập trình khác.
Closures có thể thu nạp và lưu trữ giá trị tham chiếu đến bất kỳ hằng số và biến
nào đó từ những bố cảnh mà chúng được định nghĩa. Điều này được gọi là đóng trên

những hằng số và biến, do đó tên “closures”. Swift xử lý tất cả công việc quản lý bộ
nhớ của việc thu nạp.
Hàm toàn cục và hàm lồng nhau, như đã giới thiệu trong Function, thực sự là
trường hợp đặc biệt của closures. Closures lấy một trong ba hình thức:
-

Hàm toàn cục là closures có một tên và không nắm bắt được bất kỳ giá trị nào cả.

-

Hàm lồng nhau là closures có một tên và có thể nắm bắt các giá trị từ hàm kèm theo
của chúng.

-

Biểu thức closure là closures không rõ tên được viết theo cú pháp nhẹ mà cóthể nắm
bắt các giá trị từ bối cảnh xung quanh.
Biểu thức closure của Swift có một phong cách trôi chảy và rõ ràng, với việc tối
ưu hóa để khuyến khích ngắn gọn, cú pháp lộn xộn-miễn phí trong các kịch bản phổ
biến. Những tối ưu hóa bao gồm:

-

Suy luận các tham số và giá trị trả về các loại từ bối cảnh

-

Implicit returns from single-expression closures

-


Khai báo tên đối số ngắn gọn

-

Trailing cú pháp closure
Closure Expressions
Hàm lồng nhau, như đã giới thiệu ở Nested Functions, là thuận tiện trong việc
đặt tên và định nghĩa các khối độc lập của mã nguồn như là một phần của một hàm lớn
hơn. Tuy nhiên, đôi khi nó là hữu ích để viết các phiên bản ngắn hơn của cấu trúc
giống như hàm không có khai báo và tên đầy đủ. Điều này đặc biệt đúng khi làm việc
với các hàm mà phải đặt vào các hàm khác như một hoặc nhiều đối số của chúng.
21


Biểu thức Closure – Closure expressions – là một cách để viết ngắn gọn trực
tiếp, tập trung vào cú pháp. Biểu thức Closure cung cấp một vài tối ưu hóa cú pháp
cho việc viết closures dưới dạng rút gọn mà không mất sự rõ ràng hay mục đích. Các
ví dụ biểu closure dưới đây minh hoạ những tối ưu hóa bằng cách chỉnh lại một ví dụ
duy nhất của hàm được sắp xếp trên một số lần lặp, ví dụ thể hiện chức năng tương tự
trong một cách gọn gàng hơn.
Closure Expression Syntax
Cú pháp biểu thức closure có thể sử dụng các tham số hằng, các tham số biến,
và ham số inout. Các giá trị mặc định không được cung cấp. Các tham số lệnh biến
thiên có thể không được sử dụng nếu đặt tên tham số lệnh biến thiên và đặt nó ở cuối
cùng trong danh sách tham số. Tuples có thể được sử dụng như là các kiểutham số và
các kiểu trả về.
letnames = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backwards(s1: String, s2: String) ->Bool {
return s1 > s2 }

var reversed = names.sort(backwards)
//Closure
reversed = names.sort({ (s1: String, s2: String) ->Bool in
return s1 > s2 })

2.2.6 Enumeration
Một liệt kê – enumeration – định nghĩa một kiểu phổ biến cho một nhóm các
giá trị liên quan và cho phép làm việc với các giá trị trong một cách an toàn kiểu trong
mã code của.
Nếu đã quen thuộc với C, sẽ biết rằng C enumerations gán những tên có liên
quan cho một tập hợp các giá trị số nguyên. Liệt kê trong Swift linh hoạt hơn nhiều, và
không cần phải cung cấp một giá trị cho từng phần tử thuộc liệt kê. Nếu một giá trị
(được biết đến như một giá trị “thô” – “raw”) được cung cấp cho mỗi phần tử, giá trị
có thể là một chuỗi, một ký tự hoặc một giá trị của bất kỳ kiểu số nguyên hoặc kiểu số
phẩy động.
Ngoài ra, các phần tử liệt kê có thể chỉ định các giá trị liên quan của bất kỳ kiểu
nào để được lưu giữ cùng với mỗi giá trị phần tử khác, giống như hợp thức hoặc biến
thức trong các ngôn ngữ khác. Có thể định nghĩa một tập hợp chung của các phần tử
liên quan như là một phần của một enumeration, mỗi phần tử trong số đó có một bộ
các giá trị khác nhau của các kiểu thích hợp liên kết với nó.

22


Liệt kê trong Swift là lớp đầu tiên theo đúng nghĩa của nó. Chúng áp dụng
nhiều tính năng truyền thống được hỗ trợ chỉ bởi các lớp, chẳng hạn như các thuộc tính
tính toán để cung cấp thêm thông tin về giá trị hiện tại của liệt kê – enumeration, và
phương thức thể hiện – instance - để cung cấp các chức năng liên quan đến các giá trị
liệt kê biểu diễn. Enumerations cũng có thể định nghĩa trình khởi tạo để cung cấp một
giá trị phần tử ban đầu; có thể được mở rộng để mở rộng chức năng của chúng vượt ra

ngoài thực hiện ban đầu của chúng; và có thể phù hợp với các giao thức để cung cấp
chức năng tiêu chuẩn chức năng.
//khai báo enum
//cách 1
enum testEnum{
case Trai
case Phai
case Tren
case Duoi }

2.2.7 Classes and Structures
Lớp (class) và cấu trúc (structure) được tạo ra với cùng mục đích chung, những
cấu trúc linh hoạt đó trở thành các khối xây dựng của mã chương trình. Ta định nghĩa
các thuộc tính và phương thức để thêm chức năng cho các lớp và cấu trúc bằng cách
sử dụng chính xác cú pháp tương tự như đối với các hằng, biến, và các hàm.
Không giống như các ngôn ngữ lập trình khác, Swift không yêu cầu phải tạo ra
giao diện độc lập và các tập tin thực hiện cho các lớp và cấu trúc tùy chỉnh. Trong
Swift, ta định nghĩa một lớp hoặc một cấu trúc trong một tập tin duy nhất, và các giao
diện mở rộng để lớp hoặc cấu trúc đó tự động làm sẵn cho các mã code khác để sử
dụng
So sánh Classes và Structures
Class và Structure trong Swift có nhiều điểm chung. Cả hai có thể:
- Định nghĩa các thuộc tính(Property) để lưu trữ các giá trị.
- Định nghĩa các phương thức(Method) để cung cấp chức năng.
- Định nghĩa subscripts để cung cấp quyền truy cập vào các gía trị của chúng sử
dụng cú pháp subscript.
- Định nghĩa bộ khởi tạo để thiết lập trạng thái ban đầu của chúng.
- Để mở rộng triển khai chức năng của chúng ra bên ngoài thực thi mặc định.
23



- Phù hợp với các giao thức để cung cấp những chuẩn chức năng của một kiểu
nhất định.
Lớp – class – có khả năng mở rộng, cấu trúc -structure – thì không:
- Tính kế thừa cho phép một lớp thừa hưởng các đặc tính của lớp khác.
- Type casting cho phép ta kiểm tra và giải thích kiểu của một thể hiện lớp trong
thời gian chạy.
- Deinitializers cho phép thể hiện của một lớp giải phóng bất kỳ mã nguồn nào
đó mà nó được gán.
//Khai Báo
class AClass{ }
struct AStruct { }

Class and Structure Instances
Lấy các giá trị trong Class và Struct
//Lấy giá trị trong Class và Struct
var BStruct = AStruct()
var BClass = AClass()
print("Lấy giá trị b: \(BStruct.b)")
print("Lấy giá trị a: \(BClass.a)")
//Kết quả: "Lấy giá trị b: 3"
//Kết quả: "Lấy giá trị a: 0.3"

Thay đổi giá trị trong Class và Struct:
//Thay đổi giá trị
BStruct.a = 5
BStruct.b = 10
print("Giá trị a: \(BStruct.a) và b: \(BStruct.b)")
//Kết quả: "Giá trị a: 5 và b: 10"


2.2.8 Subscript
Lớp (class) , cấu trúc (structure) , và kiểu liệt kê (enumaration) có thể định
nghĩa subscript, đó là các phím tắt để truy cập vào các phần tử của một tập hợp, danh
sách, hoặc chuỗi. Sử dụng subscripts để thiết lập và lấy giá trị của index mà không cần
phương thức riêng biệt cho thiết lập và phục hồi.
Subscript Syntax
24


Subscripts cho phép truy vấn các thể hiện của một kiểu bằng cách viết một hoặc
nhiều giá trị trong dấu ngoặc vuông sau tên thể hiện. Cú pháp của chúng tương tự cho
cả cú pháp phương thức thể hiện và cú pháp thuộc tính tính toán. Viết định nghĩa
subscript với từ khóa subscript, và chỉ định một hoặc nhiều tham số đầu vào và một
kiểu trả về, trong cùng một cách như các phương thức thể hiện. Không giống như các
phương thức thể hiện, kí hiệu có thể được đọc-ghi hay chỉ-đọc. Hành vi này được
truyền đạt bởi một getter và setter trong cùng một cách như đối với thuộc tính tính
toán.
2.2.9 Inheritance(Kế Thừa)
Một Class có thể kế thừa (inherit) method, property, và các đặc tính khác từ các
Class khác. Khi một Class kế thừa từ một lớp khác, Class kế thừa được gọi là một
Class con (subclass), và Class được nó kế thừa gọi là Class cha (superclass) của nó. Kế
thừa là một hành vi cơ bản để phân biệt các lớp từ các kiểu khác nhau trong Swift.
Class trong Swift có thể gọi và truy cập các method, property, và subscript
thuộc class cha của chúng và có thể cung cấp các phiên bản ghi đè của bản thân chúng
với những method, property, và subsript để tinh chỉnh hay thay đổi hành vi của chúng.
Swift giúp đảm bảo việc ghi đè là chính xác bằng cách kiểm tra các định nghĩa ghi đè
có một định nghĩa phù hợp với class cha.
Class cũng có thể thêm các quan sát thuộc tính với các thuộc tính kế thừa để
được thông báo khi giá trị của một thuộc tính thay đổi. Quan sát thuộc tính có thể được
thêm vào bất kỳ thuộc tính nào, cho dù ban đầu nó được định nghĩa như là một thuộc

tính lưu trữ hoặc thuộc tính tính toán

//Kế thừa
class AClass{
var a = 5
var name: String{
return "Jobs, số: \(a)" }
func tinh(){ } }
let BClass = AClass()
print("\(BClass.name)")

2.2.10 Subclass(lớp con)
25


×