1
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO THỰC TẬP
LẬP TRÌNH ỨNG DỤNG TRÊN NỀN TẢNG iOS
Công ty thực tập
: Zalo, Công ty cổ phần VNG
Người phụ trách
: Ninh Đắc Thêm
Thực tập sinh
: Nguyễn Hồng Phúc
TP. Hồ ChíMinh, tháng 07 năm 2020
Nguyễn Hồng Phúc
2
LỜI MỞ ĐẦU
Ngày nay, cùng với sự phát triển vượt bậc của điện thoại thông minh đãkéo theo sự phát
triển thần tốc của những ứng dụng trên di động. Theo thông tin đến từ công ty nghiên cứu thị
trường Annie, đến năm 2022, người tiêu dùng sẽ chi khoảng 157 tỉ USD cho các ứng dụng hàng
năm. Con số đó đang khẳng định rằng ngành công nghiệp ứng dụng di động là một bộ phận
không thể thiếu của ngành công nghiệp phần mềm.
Khơng nằm ngồi cuộc chơi, Việt Nam cũng đang tí
ch cực nỗ lực vàphát triển ngành
cơng nghiệp ứng dụng di động phát triển mạnh mẽ, để hòa nhập với những cơng ty hàng đầu về
lập trì
nh ứng dụng trên thế giới.
Lĩnh vực lập trình ứng dụng di động phát triển bắt kịp xu hướng phát triển chung, đáp
ứng tốt nhu cầu, đòi hỏi thực tế của con người. Vìthế em quyết đinh lựa chọn lập trì
nh ứng
dụng trên điện thoại, cụ thể làtrên nền tảng iOS để tì
m hiểu vàđịnh hướng cho việc học cũng
như nghề nghiệp sau này.
Sau quátrình học tập, lĩnh hội được nhiều kiến thức nền tảng bổ í
ch từ thầy cơ, để cóthể
ứng dụng vào thực tế, tích lũy kinh nghiệm cho bản thân. Em đãlựa chọn Zalo Group, Công ty
cổ phần VNG – làmơi trường lý tưởng vàchun nghiệp giúp em cócơ hội thực hiện dự định
bản thân.
Nguyễn Hồng Phúc
3
LỜI CẢM ƠN
Trân trọng gửi lời cảm ơn Công ty cổ phần VNG, cụ thể làZalo Group đã tạo điều kiện
cho em có cơ hội được thực tập tại cơng ty.
Chỉ trong một thời gian ngắn, nhưng nhờ sự chỉ dẫn nhiệt tình của anh leader, em đã tiếp
thu được những kiến thức quan trọng để có thể làm được một ứng dụng di dộng. Chân thành
cảm ơn anh lead vàcác anh chị trong nhóm iOS Platform đã bỏ ra nhiều thời gian, cơng sức để
hướng dẫn em hồn thành đợt thực tập này.
Đặc biệt cảm ơn vàlòng biết ơn sâu sắc tới anh Ninh Đắc Thêm, đã training iOS, hướng
dẫn, giúp đỡ cho em tận tình cả những khó khăn trong cơng việc, đến những khó khăn việc làm
quen với môi trường mới cũng như trong việc tiếp cận các kiến thức công nghệ, các kỹ năng về
tư duy lập trình vàtư duy sản phẩm để có thể làm ra một sản phẩm trong thời gian qua.
Em cũng xin cảm ơn thầy cô trong khoa Công nghệ phần mềm đã nhiệt tình hỗ trợ, tạo
điều kiện em làm bài báo cáo này.
Nguyễn Hồng Phúc
Tp.HCM, ngày 29 tháng 07 năm 2020
Nguyễn Hồng Phúc
4
NHẬN XÉT CỦA KHOA
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
...................................................................................................................................................
Nguyễn Hồng Phúc
5
Nội dung
LỜI MỞ ĐẦU ........................................................................................................................... 2
LỜI CẢM ƠN ............................................................................................................................ 3
CHƯƠNG 1: GIỚI THIÊU CÔNG TY THỰC TẬP .................................................................. 7
1.1 Giới thiệu VNG Corp ........................................................................................................ 7
1.2 Sản phẩm của công ty ....................................................................................................... 7
1.3 Lịch làm việc khi thực tập tại công ty ............................................................................... 8
CHƯƠNG 2: NỘI DUNG THỰC TẬP ...................................................................................... 9
2.1 Tì
m hiểu cơng ty vàcác kỹ năng cơ bản trong công ty ...................................................... 9
2.2 Nghiên cứu kỹ thuật .......................................................................................................... 9
2.2.1 Các công cụ làm việc .................................................................................................. 9
2.2.2 Git / Git workflow ...................................................................................................... 9
2.2.2 Tìm hiểu ngơn ngữ Objective-C................................................................................ 10
2.2.3 Lập trình iOS với Objective-C .................................................................................. 12
2.2.4 Tìm hiểu ngơn ngữ Swift .......................................................................................... 14
2.2.5 Lập trình “Reactive programing” .............................................................................. 20
3. Thực hiện project ........................................................................................................ 21
CHƯƠNG 3: CHI TIẾT VỀ PROJECT ................................................................................... 22
3.1
Giới thiệu về ứng dụng ............................................................................................... 22
3.2
Thực hiện .................................................................................................................... 23
3.2.1 Màn hình lựa chọn chức năng .................................................................................. 23
3.2.2 Màn hình chức năng nhiều đối tượng tiêu thụ từ camera .......................................... 24
3.2.3 Màn hình áp dụng nhiều bộ lọc ................................................................................ 25
3.2.4 Màn hình áp dụng hiệu ứng video ............................................................................. 26
3.2.5 Màn hình chụp ảnh/quay video ................................................................................. 27
3.2.6 Kết quả xử lýảnh và video được lưu vào thư viện .................................................... 29
TỔNG KẾT ............................................................................................................................. 32
Nguyễn Hồng Phúc
6
Nguyễn Hồng Phúc
7
CHƯƠNG 1: GIỚI THIÊU CÔNG TY THỰC TẬP
1.1 Giới thiệu VNG Corp
VNG được thành lập ngày 09/09/2004, làmột trong những công ty Internet vàCông
nghệ hàng đầu Việt Nam vàĐông Nam Á, kỳ lân công nghệ 1 tỷ USD+ duy nhất của Việt
Nam với hơn 3200 thành viên.
VNG có văn phịng đặt tại 5 quốc gia, các lĩnh vực hoạt động của VNG tập trung
vào 4 nhóm sản phẩm chủ lực, mang đến cho người dùng những trải nghiệm phong phú
vàđơn giản hơn.
1.2 Sản phẩm của công ty
Hệ sinh thái ứng dụng vàdịch vụ của VNG bao gồm 4 nhóm chí
nh, bao gồm:
• Trịchơi trực tuyến:
Phát triển vàsản xuất trịchơi trực tuyến, phát hành ra thị trường quốc tế.
Sản phẩm: Khu vườn trên mây, Dead target, iCá,…
Nhập khẩu vàphát hành các tròchơi nổi tiếng thế giới.
Sản phẩm: VõLâm Truyền Kỳ, Rules of Survival, Crossfire Legend…
•
Nền tảng kết nối:
Các nền tảng kết nối đa dạng, đa dịch vụ, phục vụ toàn diện nhu cầu kết nối,
giải trí, tìm kiếm của cá nhân và tổ chức.
Nền tảng OTT Zalo, hệ sinh thái mạng xã hội giải trí Zing (Zing TV, Zing
MP3, …)
Các nền tảng vCS, 123Go, 123Phim, cơng cụ tìm kiếm Laban.vn….
Nguyễn Hồng Phúc
8
• Tài chính vàthanh tốn:
Các nền tảng và dịch vụ trung gian thanh tốn, tài chí
nh cá nhân theo xu
hướng mới.
Sản phẩm: Cổng trung gian thanh tốn 123 Pay, Ví điện tử ZaloPay.
• Dịch vụ đám mây:
Cung cấp các dịch vụ đám mây toàn diện cho tổ chức, doanh nghiệp, địa
phương.
Các hệ thống, giải pháp công nghệ thông minh dựa trên kết nối Internet và
công nghệ đám mây.
Sản phẩm: 123CS, Cloud server, IoT HUB, vCloudStack, vObjectStorage,
Tape Backup, vCloudcam, Vending Machine, …
1.3 Lịch làm việc khi thực tập tại công ty
Em tham gia làm việc tại công ty bắt đầu từ ngày 02/12/2019 tới 30/05/2020. Công việc
hằng ngày bắt đầu từ lúc 9:00am tới 6:00pm. Thời gian nghỉ trưa khoảng 1 tiếng rưỡi.
Sau mỗi ngày làm việc em sẽ báo cáo tiến độ công việc trong ngày, đặt câu hỏi vànhận
chia sẻ, giải đáp từ anh hướng dẫn, đặt mục tiêu cho ngày làm việc tiếp theo. Mỗi tuần sẽ
họp tiến độ tuần 1 lần, thường sẽ làchiều thứ 6. Mọi người sẽ cùng họp vàbàn bạc về
các vấn đề đãgiải quyết, tồn đọng, bài học, giải pháp vàmục tiêu cho tuần tiếp theo.
Nguyễn Hồng Phúc
9
CHƯƠNG 2: NỘI DUNG THỰC TẬP
2.1 Tìm hiểu cơng ty và các kỹ năng cơ bản trong công ty
Thời gian : 1 ngày
Nội dung : Giới thiệu về công ty, cách tổ chức của công ty
Được nghe người phụ trách giới thiệu về cơng ty, q trì
nh thành lập và phát
triên, quy trình làm việc từ cao xuống thấp, cách thức tổ chức của cơng ty .
Ngồi ra, thực tập sinh còn được giới thiệu về cách thức làm việc trong công ty
như thời gian đi làm, các quy định cần phải tuân thủ, cách sử dụng email trong công
việc…
Kết quả : Hiểu thêm về công ty cổ phần VNG, q trình thành lập và phát triển. Có
thêm các kỹ năng về việc sử dụng email trong công việc, làm việc có kế hoạch, có kỷ
luật, có trách nhiệm hơn.
2.2 Nghiên cứu kỹ thuật
2.2.1 Các công cụ làm việc
Thời gian : 1 ngày
Nội dung : Tìm hiểu về các cơng cụ sẽ được sử dụng trong quá trình làm việc.
Trong thời gian này, anh lead đã hướng dẫn thực tập sinh tìm hiểu về các cơng cụ sẽ
giúp ích cho trong công việc sau này. Một số phần mềm trong số đó như Bộ cơng cụ
XCode sử dụng để lập trình ứng dụng iOS, Zalo - ứng dụng trao đổi vàlàm việc nhóm,
Source Tree - ứng dụng quản lýphiên bản mãnguồn.
Thực hiện : Thực hành sử dụng các phần mềm đã nêu trên.
Kết quả : Sử dụng thành thạo các chứng năng cơ bản của các phần mềm nêu trên, đáp
ứng nhu cầu làm việc trong suốt quãng thời gian thực tập.
2.2.2 Git / Git workflow
Thời gian : 1 ngày
Nội dung: Được giới thiệu chi tiết về Git
Nguyễn Hồng Phúc
10
-
Repository: nơi để lưu trữ, là thư mục chứa tất cả mã nguồn, phiên bản.
-
Head: một con trỏ chỉ vô mã nguồn mới nhất bạn đang làm việc.
-
Add: giúp Git biết được tập tin này cần được theo dõi.
-
Commit: yêu cầu Git lưu lại trạng thái của repo hiện tại.
-
Remote: nơi chứa repositories nhưng không không nằm trên máy của mình mà nằm
ở đâu đó khác (như Github, Gitlab ...).
-
Pull: giúp lấy mã nguồn từ remote về.
-
Push: tải mã nguồn lên remote.
-
Merge: kết hợp 2 phiên bản khác nhau của mã nguồn lại thành một.
-
Status: hiển thị thơngtin về tình trạng hiện tại của repo.
Ngoài những cơ bản mà người dùng Git nào cũng biết, em còn được biết thêm trong
q trình thực tập ở cơng ty các lệnh khác như:
-
Git rebase: quátrình gắn một nhánh vào nhánh gốc.
-
Gitlog: ghi lại những thao tác xảy ra với repo.
-
Git branch: phân nhánh để làm việc với Git.
Vàđể phối hợp nhịp nhàng giữa các thành viên với nhau, công ty sử dụng git workflow.
Kết quả :
-
Nắm được cơ bản về Git
-
Biết được cách sử dụng và áp dụng vào cơng việc
2.2.2 Tìm hiểu ngôn ngữ Objective-C
Thời gian : 3 ngày
Nội dung : Được training về ngôn ngữ Objective-C, Foudation framework.
-
Biên dịch vàchạy chương trì
nh
Sử dụng Xcode để soạn thảo code , cấu trúc cơ bản của 1 chương trì
nh.
-
Class, Object vàMethod :
Các khái niệm này tương tự với các khái niệm đãđược học trong mơn lập trì
nh hướng
đối tượng, tuy nhiên cách triển khai, cũ pháp có phần khác so với các ngôn ngữ như
C++, Java.
Nguyễn Hồng Phúc
11
Mỗi class sẽ được định nghĩa bằng từ khóa @interface vàkết thúc bởi @end, class có
thể kế thừa class khác bằng từ khóa “:”, tương tự java – Objective-C chỉ cho phép đơn
kế thừa vàmặc định đều dẫn xuất từ lớp NSObject.
Mỗi Class được khai báo trong file .h vàhiện thực trong file .m. Với file .m class
được bắt đầu với từ khóa @implement vàkết thúc bởi @end
Method được khai báo theo cúpháp:
method type (return type) methodName: (argumentType) argumentName
-
Kiểu dữ liệu vàcác toán tử
Thực tập sinh sẽ được hướng dẫn về các kiểu dữ liệu cơ bản các các toán tử trong
Objective-C.
-
Vòng lặp, biểu thức quyết định :
Các phương pháp lặp như sử dụng câu lệnh for, while, do. Biểu thức quyết định if,
switch vàtoán tử điều kiện.
Nguyễn Hồng Phúc
12
-
Categories, Protocols, Delegate
Categories cung cấp cách đơn giản để module hóa định nghĩa class, nhóm chúng thành
các phần chứa các method liên quan. Nhờ vào chức năng này ta cũng cóthể mở rộng
các method cho các Method trên Object đãcó.
Protocols có thể xem như interface trong Java, chứa tập các method màcác class có
thể định nghĩa hoặc khơng (@require or @optional).
Ta sử dụng delegate để ủy quyền thực thi 1 method nào đó trên class có implement
protocols được yêu cầu bởi delegate.
-
Các phần được kế thừa từ ngôn ngữ C:
Bao gồm mảng, Hàm, Blocks, Structures, pointer,…
-
Foundation Framework
Tìm hiểu về Numbers, Strings, Collections, quản lýbộ nhớ (retain – release), ARC.
-
Code complete and coding convention.
Thực hiện :
-
Tham gia đầy đủ các buổi training của công ty.
-
Làm các bài thực hành, kiểm tra về kiến thức đã học.
Kết quả :
-
Nâng cao kỹ năng lập trình với ngơn ngữ Objective-C
-
Có được những kiến thức quan trọng cho việc lập trình iOS sau này.
-
Ngồi ra còn được biết thêm một số quy tắc trong việc viết code sao cho đúng
chuẩn, dễ đọc, dễ hiểu, các phương pháp xử lýtránh việc crash app.
2.2.3 Lập trình iOS với Objective-C
Thời gian : 5 ngày
Nội dung : Được training về các thành phần quan trọng trong lập trì
nh iOS. Các design
pattern thường dùng, tối ưu hiệu suốt chương trì
nh, áp dụng kiến trúc MVC vàMVVM
trong ứng dụng.
-
Quản lýbộ nhớ:
Nguyễn Hồng Phúc
13
Hiểu về ARC vànon ARC (sử dụng Grand Central Dispatch).
Giải quyết các vấn đề liên quan đến memory để tránh crash app
-
View, Controller, Navigation:
Sử dụng view cho việc hiện thị vàquản lý bằng controller. Điều hưỡng giữa các màn
hì
nh bằng Navigation
-
Table Views vàAutoLayout:
Quản lýform input sử dụng tableview vàauto layout.
Tạo vàsử dụng tableview template
Sử dụng auto layout để pin, center vàalign views
Debug auto layout runtime constrain conflicts
Quản lýintrinsic conten size, conten hunging vàexpansion.
-
Animation, Gestures vàcontainer View Controllers
-
Custom views vàView Controller Transitions:
Tạo View từ nib file
Vẽ từ Graphic context
Define custom transition khi chuyển giữa 2 view controller
-
Networking programing:
Sử dụng native API (NSURLconnection, NSURLSession) và thư viện thứ 3
(AFNetworking)
-
Optimisation/ Improvement
-
Application architecture design
-
Design partten:
Tì
m hiểu về các partten phổ biến như: Observer, Callback, SigleTon
Thực hiện :
-
Tham gia đầy đủ các buổi training của công ty.
-
Làm các bài thực hành, kiểm tra về kiến thức đã học.
Kết quả :
-
Sử dụng thành thạo các views cơ bản
Nguyễn Hồng Phúc
14
-
Cókhả năng tạo các wraper để thread-safe
-
Custom view theo yêu cầu
-
Hiểu về kiến trúc của 1 ứng dụng theo mơhì
nh MVVM, auto binding bằng observer
partten.
-
Sử dụng các design partten giúp code dễ đọc, lập trì
nh tốt hơn.
-
Lập trình đa luồng sử dụng GDC
-
Tối ưu chương trình bằng cách sử dụng cache, buzy loading
2.2.4 Tìm hiểu ngơn ngữ Swift
Thời gian : 3 ngày
Nội dung: Các kiến thức về ngôn ngữ lập trì
nh Swift 5.2
Collection Type: Swift cung cấp 3 kiểu dữ liệu tập hợp cơ bản, bao gồm array, set,
dictionary.
Mảng (array) làtập hợp các giátrị được lưu trữ theo thứ tự.
Tập hợp (set) làtập hợp các giátrị riêng biệt vàkhông theo thứ tự.
Dictionary làtập hợp khơng cóthứ tự, được lưu dưới dạng key – value.
Trong 1 collection thìcác giátrị được lưu theo cùng kiểu dữ liệu, ta không thể chèn 1
kiểu dữ liệu khác bởi sự bất cẩn
Control Folow: So với các ngôn ngữ khác, Swift cung cấp khánhiều câu lệnh lên quan
đến điều khiển luồng. Bao gồm for in loop, while, repeat – while. Các câu lệnh điều kiện:
If, switch. Control transfer statements: continue, break, fallthrough, return, throw.
Function: hàm được khai báo vàsử dụng theo cúpháp
Func functionName(label name: type,…) -> (return type) { body }
Theo mặc định, tham số được truyền vào hàm làhằng số nên nếu muốn thay đối giátrị
của tham số trong quátrình sử dụng hàm ta cần dùng đến in-out parameters bằng cách
thêm từ khóa inout trước kiểu dữ liệu.
Nguyễn Hồng Phúc
15
Hàm cũng được sử dụng như 1 biến bằng cách khai báo tham số, kiểu trả về vàcó thể
gán bằng 1 closure bất cứ lúc nào.
Tham số truyền vào vàkiểu trả về của hàm cũng cóthể là1 (hay nhiều) hàm khác.
Closures: Tương tự như block trong Objective-C, closure cóthể capture và lưu giữ tham
chiếu đến biến vàhằng từ context nóđược định nghĩa.
{ (parameters) -> return_type in
Statements
}
Chúng ta cóthể truy cập nhanh các tham số bằng kýhiệu $0, $1, … theo thứ tự tham số
thay vìdùng tên tham số 1 cách tường minh.
Khi closure được truyền qua hàm, ta có thể sử dụng nó để gọi lại sau này bằng kíhiệu
@escaping
Enumeration: Tương tự các ngơn ngữ khác, tuy nhiên nó khơng được mặc định ngầm
gán giátrị làkiểu nguyên.
Ta cóthể lặp qua các giátrị của enum bằng các thêm kýhiệu :CaseIterable ngay sau tên
của enum. Khi sử dụng ta gọi ten_enum.allCases
Mỗi case của enum cóthể lưu giátrị kiểu associated values
Case name_case(type1, type2, …)
Structures and Class:
Cả 2 đều cóthể:
-
Định nghĩa properties để lưu trữ giátrị
-
Định nghĩa các phương thức để cung cấp các chức năng
-
Định nghĩa subscrip để truy cập nhanh phần tử
-
Đinh nghĩa hàm khởi tạo
-
Comform với protocol để cung cấp các hàm chuẩn cần thiết
Nguyễn Hồng Phúc
16
Tuy nhiên cónhững thứ chỉ cóở class như:
-
Kế thừa
-
Ép kiểu vàsử dụng lúc runtime
-
Hàm hủy để giải phóng vùng nhớ
-
Reference counting để nhiều tham chiếu đến cùng 1 đối tượng
Properties: Có2 kiểu properties
-
Store property: Làbiến hoặc hằng lưu trữ 1 phần thông tin của thể hiện lớp
-
Lazy store properties: Giátrị sẽ được khởi tạo ngay sức khi gọi đến nó.
-
Computed properties: Không thực sự lưu giátrị màcung cấp getter vàoptional setter
để lấy vàgán giátrị 1 cách không trực tiếp.
Subscripts: Class, structures và enumerations có thể định nghĩa subscript để truy cập
phần tử trong collection, list, sequence. Tương tự như việc truy cấp vàgán giá trị trên
mảng.
Subscript(parametters) -> return_type {
Get { }
Set {newValue}
}
Inheritance: Một lớp cóthể kế thừa method, properties và nhưng tí
nh chất khác từ 1 lớp
cha. Method cóthể custom lại bằng cách thêm từ khóa Overide trước method.
Truy cập method, properties, subscript của lớp cha bằng từ khóa supper.method()
Initialization: làquátrình chuẩn bị cho 1 thể hiện của class, structure, enumeration để sử
dụng. Nóđược tự động gọi để tạo 1 thể hiện mới của 1 kiểu cụ thể.
Nguyễn Hồng Phúc
17
Init(parametters) {
statements
}
Swift cung cấp 1 hàm khởi tạo mặc định cho class vàstructure códefaulf values cho tất
cả properties của nónếu ta khơng cung cấp í
t nhất 1 hàm khởi tạo cho nó.
Structure có hàm khởi tạo memberwise initializer dù có cung cấp giátrị mặc định hay
không.
Designated initializers làkiểu khởi tạo chí
nh của class, cóthể gọi hàm khởi tạo phùhợp
từ class cha để tiếp tục chuỗi khởi tạo.
Convinience initializers là kiểu hỗ trợ để khởi tạo cho 1 class. Nó chỉ có thể gọi
designated hoặc convinience cógọi designated.
Trong qtrình khởi tạo được chia thành 2 pha:
-
Pha đầu tiên, tất cả store properties mànókhai báo sẽ được khởi tạo giátrị (trước
khi gọi hàm khởi tạo lớp cha). Sau khi delegate cho lớp cho nó mới được quyền
sử dụng giá trị mà nó kế thừa để gán giá trị, cứ thế gọi cho đến lớp cha ở trên
cùng.
-
Quay trở lại từ lớp cha trên cùng, mỗi hàm khởi tạo cócơ hội để custom lại, cóthể
gọi được self, các method của class. Cuối cùng các convinience cóthể custom lại
các properties.s
Deinitialization: Được gọi ngay trước khi 1 thể hiện của class được giải phóng. Chỉ có
trong class type. Deinit được gọi tự động, sau khi deinit ucar subclass được gọi xong thì
supper class sẽ được gọi.
Optional chaining: Được sử dụng cho việc truy vấn các thuộc tính, phương thức và
subscripts cóchứa optional value màcóthể nil trong quátrì
nh gọi, tránh xảy ra lỗi trong
quátrình runtime. Kết quả của câu lệnh là1 optional.
Nguyễn Hồng Phúc
18
Error handling: Trong swift xử lý với error handling pattern sử dụng NSError trong
Cocoa vàObjective-C.
Để chỉ thị rằng 1 hàm, phương thức có thể gây ra lỗi, ta sử dụng keyword throws ngay
trước phần khai báo tham số. Khi dòng dữ liệu hoạt động không như mong muốn, gọi
throw object(thỏa mãn NSError protocol) để ném ra lỗi cho phạm vi gọi tới hàm đó xử
lý.
Tương tự các ngơn ngữ khác ta cóthể sử dụng do -catch pattern để xác định vàxử lýlỗi.
Trong qtrình handling lỗi, sử dụng từ khóa defer để tạo ra tập lệnh bảo đảm sẽ thực thi
ngay trước khi thoát ra khỏi phạm vi hiện tại.
Type casting: Cách để kiểm tra kiểu của 1 thể hiện (instance), hoặc để xem nónhư là1
kiểu của lớp cha, lớp con trong cùng cây phân cấp. Toán tử kiểm tra kiểu (is) giúp kiểm
tra đó có phải làthể hiện của 1 lớp nào đó hay khơng. Thực tế 1 biến, hằng của 1 class
thực chất là1 thể hiện của 1 lớp con nào đó, nếu biết được lớp con đócóthể là1 lớp X ta
sẽ chuyển đổi kiểu dựa trên toán tử down casting (as). Kết quả của phép biến đổi này có
thể thất bại nên ta sử dụng as? Vàas!.
Swift cung cấp 2 kiểu đặc biệt để làm việc với kiểu dữ liệu không rõ ràng (nonspecial).
Any cho thể hiện của tất cả kiểu bảo gồm cả function type. AnyObject cho tất cả class
type.
Extensions: Giúp mở rộng (thêm – không được overide) chức năng vào một class, struct,
enumeration, protocol cósẵn – bao gồm cả phần source code màchúng ta không thể truy
cập trực tiếp (tương tự category trong Objective-C nhưng không có tên). Chú ý là
extensions chỉ có thêm được computed properties, nhưng không thể store properties hay
observers properties đãtồn tại.
Nguyễn Hồng Phúc
19
Protocols: Định nghĩa các method, properties, các yêu cầu phùhợp với 1 nhiệm vụ, chức
năng cụ thể. Được adopt bởi class, structure, hoặc enumeration để thực sự thực thi yêu
cầu cụ thể.
Ngồi ra protocols cịn cóthể dùng như là1 parameter, kiểu trả về của method, function,
initializer. Một kiểu dữ liệu của biến, hằng, property. Một kiểu của items trong các
container (array, dictionary,…).
Delegation làmột design parten cho phép 1 class, structure thực hiện 1 hành động của 1
class khác thông qua protocols.
Một protocol có thể kế thừa một hoặc nhiều protocol khác. Nếu muốn protocol nào đó
chỉ được adopted bởi class (khơng phải structure, enumeration) ta kế thừa AnyObject
protocol.
Các protocol có thể kế hợp với nhau khi ta muốn 1 kiểu dữ liệu phải conform nhiều
protocols 1 lúc với protocol composition (tốn tử &). Chúng ta cũng có thể kết hợp
tương tự trong trường hợp muốn 1 kiểu giátrị thỏa mãn làsubclass của 1 class vàthỏa
mãn protocol nào đó.
Generics: Generic code cho phép chúng ta viết code 1 cách linh động, có tí
nh sử dụng
lại (mang tính chất chung, dùng được trong nhiều trường hợp – tương tự khái niệm
template trong C++).
Generic function với cúpháp dạng:
Func swap<T>(_ a: intout T, _ b: inout T)
Generic type cho phép ta định nghĩa 1 kiểu dữ liệu (custom của class, structure,
enumeration)
Struct Stack<Element>{ xử lýcác phần tử với tên gọi của kiểu dữ liệu làElement}
Trong 1 số trường hợp, ta sẽ cần đến sự ràng buộc đối với kiểu dữ liệu được thay thế (T).
Vídụ như Dictionary nhận key phải conform với hashable interface. Ràng buộc này yêu
cầu T phải thỏa mãn làsubclass của S | thỏa mãn protocol P | protocol composition.
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U)
Nguyễn Hồng Phúc
20
Associated types: sử dụng trong protocol với từ khóa associatedtype Item để định nghĩa
1 kiểu dữ liệu nhưng khơng cómơtả rõràng, khi nóđược adopted thìmới được rõràng.
Vídụ, Protocol Container có kiểu phần tử là Item (chưa nó nó cụ thể là như thế nào)
nhưng ta muốn tham số của append vàsubscript đều làItem. Ta sẽ cần định nghĩa kiểu
Item trong protocol này: associatedtype Item.
Automatic Refrerence Counting: Cơ chế theo dõi vàquản lýbộ nhớ màta đãsử dụng,
tự động giải phóng bộ nhớ sử dụng bởi thể hiên của class khi không còn sử dụng nữa.
Mỗi khi 1 thể hiện của class được tạo ra, ARC tự động tạo 1 vùng nhớ để lưu thơng tin
về thể hiện đó, nósẽ theo dõi các tham chiếu đến thể hiện, vùng nhớ sẽ không được giải
nếu vẫn còn tham chiếu đến thể hiện. Mỗi khi gán 1 thể hiện cho 1 thể hiện khác, sẽ có1
tham chiếu “strong” đến nó.
Cần lưu ývàxử lývới reference cycles 2 thể hiện của class, thể hiện class với Closures.
Khi xử lýinstance, sử dụng week đối với thể hiện cóvịng đời nhỏ hơn vàunowned với
thể hiện có vịng đời lớn hơn hoặc bằng. Khi xử lý closure, sử dụng unowned khi
instance vàclosure cócùng thời điểm giải phóng (ln tham chiếu đến nhau).
Memory Safety: Mặc định, mọi thao tác khi lập trì
nh đều được Swift ngăn chặn nếu nó
làunsafe. Nó bảo đảm biến luôn được khởi tạo trước khi sử dụng, vùng nhớ sẽ khơng
được truy cập nếu nó chưa được cấp phát, kiểm tra mảng vượt quágiới hạn, giải quyết
xung đột khi nhiều sự truy cập vào 1 cùng vùng nhớ,…
2.2.5 Lập trình “Reactive programing”
Thời gian: 5 ngày
Nội dung: Tìm hiểu vàtiếp cập phướng pháp lập trì
nh theo luồng dữ liệu.
Thực hiện:
Nguyễn Hồng Phúc
21
Tì
m hiểu nguyên lý hoạt động của các framework hỗ trợ lập trì
nh phản ứng, gồm có
reactive cocoa, reactRX, reactiveSwift, reactiveObjectiveC. Trong đó tập trung thực hành
bằng reactiveSwift.
Kết quả: Sử dụng thành thạo lập trì
nh dạng tí
n hiệu vàcó khả năng áp dụng vào các bài
toán thực tế
3. Thực hiện project
Sau một thời gian khi đãnắm được các kiến thức lập trì
nh cơ bản trên iOS. Em được giao
các cơng việc tập trung vào xây dựng component cho Zalo Swift. Trong cuốn báo cáo này
em xin được trình bày project gần đây nhất, đólàxây dựng camera AR.
Nguyễn Hồng Phúc
22
CHƯƠNG 3: CHI TIẾT VỀ PROJECT
3.1 Giới thiệu về ứng dụng
Ứng dụng là1 thành phần được phát triển độc lập, có khả năng tí
ch hợp vào các ứng
dụng lớn khác cần đền chức năng sử dụng camera nâng cao. Ứng dụng gồm các chức
năng chính sau:
-
Frame filter: lọc ảnh được quay từ camera thành các hì
nh ảnh có màu sáng tùy
chỉnh, ứng dụng hỗ trợ nhiều bộ lọc để người dụng lựa chọn.
-
Sticker: Thêm các stickers vàcho phép chỉnh sửa thủ cơng (xoay, di chuyển, thu
phóng).
-
Video effect: Thêm các hiệu ứng động vào video (sấm chớp, tim bay,…)
-
Lưu trữ vàchia sẻ: Video, ảnh sau khi xử lýđược lưu trữ trên bộ nhớ điện thoại,
cóđịnh dạng phùhợp vàdễ dàng chia sẻ lên mạng xãhội
-
Xử lý được lọc nâng cao (nhiều bộ lọc lồng ghép), từ 1 nguồn phát (camera,
video) cóthể tạo ra cùng lúc nhiều hiệu ứng sử dụng cho nhiều views khác nhau.
Mục tiêu cần đạt:
-
Ứng dụng đáp dứng các yêu cầu đặt ra ban đầu
-
Tối ưu xử lýảnh để tiếc kiệm năng lượng
-
Ứng dụng chạy thời gian thực (>24 FPS)
-
Cóthể tích hợp dễ dàng vào hệ thống khác
Nguyễn Hồng Phúc
23
3.2 Thực hiện
Project được thực hiện vàđãcósản phẩm dùng thử như sau:
3.2.1 Màn hình lựa chọn chức năng
Các bước thực hiện:
-
Tạo các UIButton với frame bằng ¼ màn hì
nh
-
Add Target vànavigate đến các Controller tương ứng
Nguyễn Hồng Phúc
24
3.2.2 Màn hình chức năng nhiều đối tượng tiêu thụ từ camera
Các bước thực hiện:
-
Tạo Image source Protocol vàáp dụng cho camera
-
Đọc dữ liệu từ camera vàchuyển thành texture
-
Sử dụng Metal shader languege tạo các bộ lọc trực tiếp bằng GPU
-
Tạo Image cosumer protocol sử dụng cho bộ lọc vàview cuối cùng
-
Hiển thị ảnh lên view mỗi khi texture availble (>30 hì
nh/giây)
-
Nguyễn Hồng Phúc
25
3.2.3 Màn hình áp dụng nhiều bộ lọc
Các bước thực hiện:
-
Đọc dữ liệu từ camera áp dụng Image source protocol
-
Xử lýmỗi bộ lọc 1 lần cho đến bộ lọc cuối
-
Hiển thị kết quả lên view mỗi frame
Nguyễn Hồng Phúc