I.Cơ bản về lập trinh 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 dồ
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 bạn làm việc với các giá trị mà không cần thay đổi.
Ngoài các kiểu quen thuộc , Swift còn giới thiệu một kiểu mới
hoàn toàn không có
trong Objective C, đó là kiểu Tuple. Tuple cho phép bạn tạo
và gom nhóm các giá trị
không cùng kiểu dữ liệu. Tuple có thể trả ra nhiều giá trị từ
một hàm như là một giá
trị duy nhất.
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 tương tự như sử dụng
nil với pointer trong objective C. Optional an toàn và là một
trong những tính năng
mạnh mẽ nhất của Swift.
Swift muốn bạn phải rõ ràng về các kiểu giá trị trong quá
trình code. Điều này cho
phép bạn nắm bắt và sửa lỗi càng sớm càng tốt trong quá
trình phát triển.
A.Hằng số và biến
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.
1.Khai báo hằng và biến
Hằng và biến phải được khai báo trước khi sử dụng. Bạn phải
khai báo các hằng với
từ khoá là let và biến với từ khoá là var.
Bạn có thể khai báo nhiều hằng hoặc nhiều biến như sau:
//Hằng số
let hangso = 10
//Biến
var bien = 20
Page 7 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Bạn 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.
Ở đâ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:
Bạn có thể khai báo nhiều biến có cùng kiểu như sau:
2.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à 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ố.
Khi bạn đã khai báo một hằng hoặc một biến có kiểu nhất định,
bạn không thể khai
báo lại nữa với cùng tên, hoặc thay đổi kiểu khác.
Bạn có thể thay đổi giá trị của biến có cùng kiểu.
Với giá trị của hằng thì không thể thay đổi khi đã được khai
báo.
3.Print hằng và biến
Bạn có thể print trước kết quả của hằng hoặc biến để xem hoặc
kiểm tra.
//Khai báo nhiều hằng hoặc nhiều biến trên 1 dòng.
var a = 1, b = 2, c = 3
var xinchao:String
xinchao = "HelloWorld"
//Khai báo nhiều biến có cùng kiều trên 1 dòng.
var x, y, z:Double
//Tên Hằng và Biến.
let π = 3.14159
let 你好 = "你好世界"
let �� =
"dogcow"
//Thay đổi giá trị của biến xinchao từ HelloWorld thành
KhoaPham.Vn
xinchao = "KhoaPham.Vn"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 8 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Ở Swift 1 ta có 2 hàm in là print, println nhưng với Swift
2.0 chỉ còn hàm print.
Ta có thể dùng print để in ra những thông điệp phức tạp hơn.
Bao gồm những các
giá trị hiện tại của hằng và biến.
B.Integer
Là số nguyên. Swift cung cấp Sign và Unsign integer trong mẫu
8, 16, 32 và 64 bit.
1.Giá trị cao nhất trong Interger
Bạn có thể kiểm tra giá trị cao nhất của từng kiểu integer với
thuộc tính Max
2.Int
Bạn không cần phải chọn một kích thước cụ thể nào bởi Int sẽ
thay thế hết tất cả.
Trừ khi bạn muốn chọn một kích thước cụ thể của integer. Nên
sử dụng Int cho các
giá trị sô nguyên để hỗ trợ đoạn mã nhất quán và khả năng
tương thích hơn.
3.UInt
Bạn không cần phải chọn một kích thước cụ thể nào bởi UInt sẽ
thay thế hết tất cả.
Trừ khi bạn muốn chọn một kích thước cụ thể của integer. Nên
sử dụng UInt cho
các giá trị số nguyên dương để hỗ trợ đoạn mã nhất quán và
khả năng tương thích
hơn.
C.Kiểu Float và kiểu Double
Là một dạng phân số. Có thể lưu trữ những số thập phân mà kiểu
integer không lưu
trữ được.Swift cung cấp 2 kiểu là:
- Float(32-bit)
- Double(64-bit)
//Print Hằng và Biến.
print(xinchao)
//kết quả: "KhoaPham.Vn"
//Print thông điệp phức tạp hơn
print("Khoá Học iOS của Trung Tâm \(xinchao)")
//Kết quả: “Khoá Học iOS của Trung Tam KhoaPham.Vn”
var maxValue:UInt8 = UInt8.max //kết quả : 255
var max:Int = Int.max
//Kết quả: 9223372036854775807
var max2:UInt = UInt.max
//Kết quả: 18446744073709551615
//Giá trị lưu trữ lớn nhất của kiểu float
var float:Float = FLT_MAX //Kết quả: 3.402823e+38
//Giá trị lưu trữ lớn nhất của kiểu double
var double:Double = DBL_MAX //Kết quả:
1.797693134862316e+308
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 9 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
D.Kiểu Safety và Kiểu Inference
Swift là một ngôn ngữ lập trình an toàn. Vì thế Swift muốn bạn
phải khai báo rõ ràng
về các kiểu giá trị. Nếu có bạn khai báo biến kiểu String
thì bạn không thể truyền giá
trị kiểu Int hoặc ngược lại. Bởi vì Swift thực hiện kiểm tra
kiểu (type check) khi biên
dịch và báo hiệu những kiểu không phù hợp là lỗi. Điều này
cho phép bạn nắm bắt
và sửa lỗi càng sớm càng tốt.
Type check giúp bạn tránh được lỗi khi bạn đang làm việc với
các kiểu giá trị khác
nhau. Tuy nhiên, không có nghĩa là bạn phải xác định kiểu của
mỗi hằng và biến mà
bạn khai báo. Nếu bạn không chỉ định các kiểu giá trị, Swift
sẽ sử dụng kiểu
Inference để tìm ra kiểu thích hợp dựa trên giá trị mà bạn
đã cung cấp.
Kiểu Inference đặt biệt hữu ích khi bạn khai báo một hằng hoặc
một biến có giá trị
ban đầu.
E.Chuyển đổi kiểu số(Numeric Type Conversion)
Chuyển các kiểu Integer về một kiểu đồng nhất để phù hợp các
tình huống sử dụng.
Tránh tính trạng tràn dữ liệu, tối ưu hoá bộ nhớ.
1.Chuyển kiểu số nguyên(Integer Conversion)
Ở ví dụ dưới hằng so1 và hằng so2 có 2 kiểu số nguyên khác
nhau, vì thế ta phải ép
kiểu của hằng so1 sang cùng kiểu với hằng so2 là kiểu Int16
2.Chuyển kiểu Int với Float/Double
Ở ví dụ dưới hằng so3 có kiểu Int và hằng so4 có kiểu
Double, vì thế ta phải ưu tiên
ép kiểu Int sang Double
//Kiểu Inference sẽ hiểu là kiểu String
var chuoi = "KhoaPham.vn"
//Kiểu Inference sẽ hiểu là kiểu Int
var soInt = 23
let so1: Int8 = 2
let so2: Int16 = 1500
let tong = so2 + Int16(so1)
//Int and Float/Double
let so3 = 2
let so4 = 0.2356
let tong2so = Double(so3) + so4
//Kết quả: 2.2356
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 10 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
F.Kiểu Aliases
Thay thế một kiểu hiện có. Được khai báo với từ khoá
typealias.
Ta có thể thấy kiểu Aliases có tên alias được nhận kiểu
UInt32 và biến so5 có kiểu
alias. Thực chất là biến so5 nhận kiểu UInt32 thông qua
alias
Từ ví dụ trên ta thấy kiểu aliases hữu ích khi muốn để cập đến
một kiểu đã tồn tại
với tên khác.
G.Kiểu Boolean
Đây là kiểu trả về hai giá trị True và False.
Thường được sử dụng nhiều trong trường hợp so sánh, câu lệnh
if
Trong trường hợp bạn dùng câu lệnh if để so sánh giá trị kiểu
số:
//Kiểu Aliases
typealias alias = UInt32
var so5:alias = 5
//Kiểu Boolean
let dung = true
let sai = false
if sai{
print("Giá trị true")
}else{
print("Giá trị false")
}
//Kết quả: "Giá trị false"
let kieuso = 1
//Trường hợp sai sẽ xuất hiện lỗi
if kieuso{
}
//Trường hợp đúng
if kieuso == 1{
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 11 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
H.Kiểu Tuple
Là một kiểu mới trong Swift. Kiểu Tuple có thể nhóm các giá
trị và các giá trị đó
không nhất thiết phải cùng kiểu.
Bạn có thể nhóm nhiều giá trị khác kiểu lại với nhau.Và ta
có thể lấy từng giá trị ra
như sau:
Bạn có thể khai báo và lấy giá trị bằng cách sau:
I.Optional
Bạn có thể sử dụng Optional trong tình huống và giá trị
không có.Một Optional có
thể có 1 giá trị và nó bằng x hoặc không có một giá trị nào.
J.Error Handling
Error Handling mới được apple nâng cấp vào Swift 2.0. Bạn có
thể sử dụng Error
Handling để xử lý những lỗi mà bạn có thể gặp phải. Khi một
func gặp phải một tính
trạng lỗi nó sẽ ném ra lỗi và bạn có thể bắt lỗi và xử lý
thích hợp.
//Kiểu Tuple
let tuple = ("khoapham",123456)
print("username: \(tuple.0) và password:
\(tuple.1)")
//Kết quả: "username: khoapham và password:
123456"
let tuple2 = (username: "khoapham", password:
123456)
print("username: \(tuple2.username) và password:
\(tuple2.password)")
//Kết quả: "username: khoapham và password:
123456"
//Optional
let optional: String? = nil
if optional == nil{
print("nil")
}
//Kết quả: "nil"
//Error Handling
func XuatLoi() throws{
}
do{
try XuatLoi()
}catch{
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 12 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
II.Toán tử cơ bản
Toán tử là một ký hiệu đặc biệt hoặc cụm từ mà bạn sử dụng để
kiểm tra, thay đổi,
hoặc kết hợp các giá trị. Ví dụ, các toán tử cộng (+) thêm
hai số với nhau (như let i =
1 + 2). Ví dụ phức tạp hơn bao gồm toán tử logic AND
&& (như if enteredDoorCode
&& passedRetinaScan) và toán tử tăng dần ++ i, đó là
một lệnh tắt để tăng giá trị
của i lên 1.
Swift hỗ trợ chuẩn toán tử C và cải thiện một số tính năng để
loại bỏ các lỗi mã hóa
phổ biến. Toán tử gán (=) không trả về một giá trị, để ngăn
chặn nó được sử dụng
lẫn lộn với toán tử so sánh (==). Toán tử số học (+, -, *,
/,% và vv) phát hiện và
không cho phép tràn giá trị, để tránh những kết quả bất ngờ
khi làm việc với các con
số lớn hơn hay nhỏ hơn so với phạm vi cho phép giá trị của
các kiểu lưu trphẩyữ
chúng. Bạn có thể quyết định tham gia vào hành vi tràn giá
trị bằng cách sử dụng
các toán tràn Swift, như được mô tả trong Overflow
Operators.
Không giống như C, Swift cho phép bạn thực hiện tìm số dư
(%) tính trên số phẩy
động. Swift cũng cung cấp hai toán tử phạm vi (a ..
C, như một lệnh tắt để thể hiện một loạt các giá trị.
Phần này mô tả các toán tử phổ biến trong Swift. Advanced
Operators bao gồm các
toán tử nâng cao của Swift, và mô tả làm thế nào để xác định
các tuỳ chỉnh toán tử
của riêng bạn và thực hiện các tiêu chuẩn vận hành với nhiều
tùy chỉnh của riêng
bạn.
1.Terminology(Thuật ngữ)
Hầu hết các toán tử một ngôi, hai ngôi, hoặc ba ngôi:
- Toán tử một ngôi hoạt dộng trên một phần tử dữ liệu duy nhất
(như -a). Các
tiền tố toán tử một ngôi xuất hiện ngay lập tức trước biến của
chúng (như !b), và các
hậu tố toán tử một ngôi xuất hiện ngay sau biến của chúng
(như i ++).
- Toán tử hai ngôi hoạt động trên 2 phần tử dữ liệu (như 2 +
3) và là trung tố vì
chúng xuất hiện ở giữa hai phần tử dữ liệu của chúng.
- Toán tử ba ngôi hoạt động trên ba phần tử dữ liệu. Giống
như C, Swift chỉ có
duy nhất một toán tử ba ngôi, các điều kiện của toán tử ba
ngôi (a? b : c).
Các giá trị mà các toán tử ảnh hưởng là các toán hạng. Trong
biểu thức 1 + 2, biểu
tượng + là một toán tử nhị phân và hai toán hạng của nó là
các giá trị 1 và 2.
2.Assignment Operator(Toán tử gán)
Toán tử gán (a = b) khởi tạo hay cập nhật giá trị của a với
giá trị của b.
let b = 20
var a = 16
a = b
// Kết quả: a = 20 và b = 20
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 13 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Nếu phía bên phải của việc gán là một bộ với nhiều giá trị,
các yếu tố của nó có thể
được phân tách ra thành nhiều hằng hoặc biến cùng một lúc:
Không giống như các toán tử gán trong C và Objective-C, các
toán tử gán trong
Swift không tự trả về một giá trị. Tuyên bố sau đây là không
hợp lệ:
3.Arithmetic Operators(Toán tử toán học)
Swift hỗ trợ bốn toán tử toán học tiêu chuẩn cho tất cả các
kiểu số:
- Phép cộng (+)
- Phép trừ (-)
- Phép nhân (*)
- Phân chia (/)
Không giống như các toán tử trong C và Objective-C, các toán
tử số học Swift
không cho phép các giá trị để tràn theo mặc định. Bạn có thể
chọn tham gia vào
hành vi tràn giá trị bằng cách sử dụng các toán tràn Swift
(chẳng hạn như a & + b).
Xem Overflow Operators.
Tử tử cộng còn hỗ trợ nối chuỗi String:
4.Remainder Operator(Toán tử số dư)
Toán tử số dư (a% b) tính toán ra bao nhiêu bội số của b sẽ
phù hợp với bên a và
trả về giá trị được để lại (gọi là phần còn lại).
Đây là cách toán tử số dư hoạt động. Để tính toán 10% 8
5.Floating-Point Remainder Calculations(Toán tử số dư thập
phân)
Không giống như toán tử số dư trong C và Objective-C, toán tử
số dư của Swift
cũng có thể hoạt động trên các số dấu chấm động:
let (x,y) = (5, 10)
// Kết quả: x = 5, y = 10
//Arithmetic Operators
1 + 2 //kêt quả: 3
3 - 1 //kêt quả: 2
5*5 //kêt quả: 25
8/2 //kêt quả: 4
"khoa" + "pham" + ".vn"
//Kết quả: khoapham.vn
//Remainder Operator(Toán tử số dư)
10 % 8 //Kết quả: 2
-10 % 8 //Kết quả: -2
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 14 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
6.Increment and Decrement Operators(Toán tử tăng và giảm dần)
Toán tử tăng dần (++) có nghĩa là i = i + 1
Toán tử giảm dần(--) có nghĩa là i = i -1
Trong ví dụ trên, let b1 = ++a1 tăng giá trị của a1 trước
khi trả về giá trị của nó. Đây
là lý do tại sao cả a1 và b1 đều có giá trị mới là 1.
Tuy nhiên, let c1 = a1++ tăng giá trị của a1 sau khi trả về
giá trị của c1. Điều này có
nghĩa rằng lấy giá trị cũ là 1 và sau đó a1 được cập nhật
giá trị bằng 2.
Trừ khi bạn cần các hành vi cụ thể của i ++, khuyên bạn nên
sử dụng ++ i và –i
trong mọi trường hợp, bởi vì họ có những hành vi mong đợi điển
hình của việc sửa
đổi i và trả về kết quả.
7.Compound Assignment Operators(Toán tử gán phức hợp)
Giống như C, Swift cung cấp các toán tử gán phức hợp kết hợp
phép gán (=) với
các toán tử khác. Một ví dụ là toán tử gán thêm (+ =):
Biểu thức a2 + = 2 là viết tắt cho a2 = a2 + 2. Hiệu quả
cho, việc bổ sung và gán
được kết hợp thành một toán tử mà thực hiện cả hai tác vụ
cùng một lúc.
Một danh sách đầy đủ của các toán tử gán phức hợp có thể được
tìm thấy trong
Expressions.
8.Comparison Operators(Toán tử so sánh)
Swift hỗ trợ tất cả chuẩn toán tử so sánh trong C:
- Bằng (a == b)
- Không bằng (a! = B)
- Lớn hơn (a> b)
- Nhỏ hơn (a
- Lớn hơn hoặc bằng (a> = b)
- Nhỏ hơn hoặc bằng (a <= b)
Mỗi toán tử so sánh trả về một giá trị Bool để cho biết hay
không câu lệnh là true:
10%3.6 //Kết quả: 2.8
var a1 = 0
let b1 = ++a1 //b1=1 và a1=1
let c1 = a1++ //c1=1 và a1=2
var a2 = 5
a2 += 3 //Kết quả a2 = 8
//Comparison Operators
1 == 1 //Kết quả: true
3 != 5 //Kết quả: true
2 > 1 //Kết quả: true
6 < 10 //Kết quả: true
10 <= 20 //Kết quả: true
10 >= 20 //Kết quả:false
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 15 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Toán tử so sánh thường được sử dụng trong câu lệnh if
9.Ternary Conditional Operator(Toán tử điều kiện tam phân)
Toán tử điều kiện tam phân là một toán tử đặc biệt với ba phần,
trong đó có dạng
question ? answer1: answer2. Nó là một phím tắt để đánh giá
một trong hai biểu
thức dựa trên một trong hai giá trị question là true hay
false. Nếu question là true, nó
lấy answer1 và trả về giá trị của nó; nếu false, nó lấy
answer2 và trả về giá trị của
nó.
if question {
answer1
} else {
answer2
} Ở
ví dụ này đoạn code “(Bool ? 40 : 10)” có nghĩa là nếu Bool
là true thì lấy 40
ngược lại Bool là false lấy 10. ở đây Bool là false nên kết
quả soluong bằng 30.
10.Nil Coalescing Operator(toán tử kết hợp nil)
Toán tử hợp nhất Nil – Nil coalescing operator (a ?? b) tháo
bỏ một optional a nếu
nó bao gồm một giá trị, hoặc trả về một giá trị mặc định b nếu
a là nil. Biểu thức b
phải phù hợp với kiểu đang được lưu trữ trong a.
nil coalescing operator là một phím tắt cho mã dưới đây:
a != nil ? a! : b
Đoạn mã trên sử dụng toán tử ba ngôi và tháo buộc(a!) Để
truy cập các giá trị bên
trong một gói khi mà không phải là nil, và để trả về một giá
trị b. Toán tử hợp nhất
Nil cung cấp một cách thanh lịch hơn để đóng gói kiểm tra điều
kiện này và
unwrapping trong một hình thức ngắn gọn và dễ đọc.
11.Range Operators(Toán tử phạm vi)
Swift gồm 2 loạt toán tử là: Closed Range Operator và
Half-Open Range Operator
a)Closed Range Operator
Phạm vi toán tử kép kín (a … b) định nghĩa một phạm vi đó chạy
từ a đến b, và bao
gồm các giá trị a và b. Giá trị của a không lớn hơn b.
//Ternary Conditional Operator
let tao = 20
let Bool = false
let soluong = tao + (Bool ? 40 : 10)
//Kết quả: soluong = 30
let red = "red"
var chuoi:String? //mặc định là nil
var Mau = chuoi ?? red //nếu chuoi bằng nil thì xuất ra red
//Kết quả: "red"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 16 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Toán tử phạm vi khép kín hữu ích khi lặp qua một dãy mà bạn
muốn tất cả các giá
trị được sử dụng, chẳng hạn như với một vòng lặp for-in:
b)Half-Open Range Operator
Toán tử bán phạm vi (a ..
bao gồm b. Nó được cho là mở một nửa (half-open) bởi vì nó
có chứa các giá trị
đầu tiên, nhưng không có giá trị cuối cùng của nó. Giống như
với toán tử phạm vi
khép kín, giá trị của a không được lớn hơn b.
Toán tử bán phạm vi đặc biệt hữu ích khi bạn làm việc với
danh sách dạng zerobased như mảng, nơi mà nó hữu ích để đếm (nhưng không bao gồm)
độ dài của
danh sách:
12.Logical Operators(Toán từ logic)
Toán tử logic -Logical operators – chỉnh sửa hoặc kết hợp
các giá trị logic Boolean
true và false. Swift hỗ trợ ba chuẩn toán tử logic được tìm
thấy dựa trên ngôn ngữ
C:
- Logical NOT (!a)
- Logical AND (a && b)
- Logical OR (a || b)
a)Logical NOT Operator(Toán tử Logic NOT)
Toán tử logic NOT – logical NOT operator – (! a) đảo ngược một
giá trị Boolean để
true trở thành false, và false trở thành true.
Toán tử logic NOT là một toán tử tiền tố, và sẽ xuất hiện
ngay trước khi giá trị nó
hoạt động, mà không cần bất kỳ khoảng trắng nào. Nó có thể
được đọc là “not a”,
như đã thấy trong các ví dụ sau đây:
13.Logical AND Operator(Toán tử Logic AND)
Toán tử logic AND (a && b) tạo ra các biểu thức logic
mà cả hai giá trị phải true cho
kết quả cộng chung cũng là true.
//Toán tử phạm vi
for index in 1...10{
print("\(index)") //print từ 1 đến 10
}
for index in 1..<3 o:p="">3>
print("\(index)") //print từ 1 đến 2
}
//Toán tử Logic NOT
let khongdung = false
if !khongdung{
print("KhoaPham.Vn")
}
//Kết quả: "KhoaPham.Vn"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 17 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Nếu một trong hai giá trị là false, kết quả cộng chung cũng
sẽ là false. Trong thực tế,
nếu giá trị đầu tiên là false, giá trị thứ hai thậm chí sẽ
không được đánh giá, bởi vì
nó không thể làm thay đổi sự kết quả cộng chung tương đương
với true. Điều này
được gọi là đánh giá ngắn mạch – short-circuit evaluation.
Ví dụ này xem xét hai giá trị Bool và chỉ cho phép truy cập
nếu cả hai giá trị là true:
14.Logical OR Operator(Toán tử Logic OR)
Toán tử logic OR (a || b) là một toán tử được viết bởi hai dấu
gạch liền kề. Bạn sử
dụng nó để tạo ra các biểu thức logic trong đó chỉ có một
trong hai giá trị là true thì
những kết quả cộng chung là true.
Giống như toán tử logic AND, toán tử logic OR sử dụng đánh
giá ngắn mạch để
xem xét biểu thức của nó. Nếu phía bên trái của một biểu thức
logic OR là true, bên
phải không được đánh giá, bởi vì nó không thể thay đổi kết
quả của biểu thức tổng
thể.
III.Kiểu String and Kiểu Character
Một chuỗi là một tập hợp có sắp xếp của những kí tự, như là
“hello world” hay
“albatross”.Chuỗi trong Swift biểu diễn bằng kiểu String,
chúng lần lượt biểu diễn
một tập hợp các giá trị của kiểu ký tự (Character).
Kiểu String và Character của Swift cung cấp nhanh, cách phù
hợp với mã thống
nhất (Unicode) để làm việc với văn bản trong mã code của bạn.Cú
pháp để tạo ra
các chuỗi và thao tác đỡ nặng nề hơn và dễ đọc hơn, với cú
pháp chuỗi ký tự cũng
tương tự như C.Nối chuỗi cũng đơn giản như cách cộng hai chuỗi
với nhau với toán
tử +. và tính biến đổi chuỗi được quản lý bằng cách chọn giữa
một hằng hoặc một
biến, giống như bất kỳ giá trị nào khác trong Swift.
//Toán tử Logic AND
let checkUsername = true
let checkPassword = true
if checkUsername && checkPassword{
print("Đăng nhập thành công")
}else{
print("Đăng nhập thất bại")
}
//Kết quả: "Đăng nhập thành công"
//Toán tử Logic OR
let checkUsername = true
let checkPassword = false
if checkUsername || checkPassword{
print("Đăng nhập thành công")
}else{
print("Đăng nhập thất bại")
}
//Kết quả: "Đăng nhập thành công"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 18 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Với cú pháp đơn giản, kiểu String của Swift rất nhanh trong
việc thực hiện các thao
tác với chuỗi.Mỗi chuỗi bao gồm các ký tự Unicode mã hóa độc
lập, và cung cấp hỗ
trợ cho việc truy cập các ký tự đại diện trong mã Unicode
khác nhau.
Bạn cũng có thể sử dụng chuỗi để chèn hằng, biến, chữ, và
các biểu thức thành
chuỗi dài, trong một quá trình được gọi là suy chuỗi. Điều
này làm cho nó dễ dàng
để tạo ra các giá trị chuỗi tùy chỉnh để hiển thị, lưu trữ
và in ấn.
A.String Literal(Chuỗi kí tự)
Chuỗi kí tự là một chuỗi cố định của văn bản bao quanh bởi một
cặp dấu ngoặc
kép(“”)
B.Khởi tạo chuỗi
Cách kiểm tra chuỗi rỗng:
C.String Mutability(Biến đổi chuỗi)
Bạn có thể thay đổi chuỗi cho một biến có kiểu String bằng
cách gán vào cho biến
đó một giá trị kiểu String.
D.Character
Là một kí tự trong một chuỗi.
//Chuỗi kí tự
let chuoiString = "KhoaPham.Vn"
//Chuỗi rỗng
let chuoirong = "" //kết quả: ""
let chuoirong2 = String() //kết quả: ""
//Kiểm tra chuỗi rỗng
if chuoirong.isEmpty{
print("Đây là chuỗi rỗng")
}
//Kết quả: "Đây là chuỗi rỗng"
//Thay đổi chuỗi
var bienchuoi = "Khoa"
bienchuoi += "Pham.Vn"
var bienchuoi2 = "Trung Tâm Tin Học"
bienchuoi2 = "KhoaPham.Vn"
//Character
for character in "KhoaPham".characters{
print(character)
}
//Kết quả: K h o a P h a m
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 19 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
E.Interpolation(nội suy chuỗi)
Là một cách xây dựng chuỗi String mới từ hỗn hợp các hằng,
biến,..
F.Counting Character
Để lấy số lượng giá trị trong một chuỗi hàm sau:
Để so sánh 2 chuỗi với nhau, ta dùng toán tử bằng(==), toán
tử không bằng(!=)
IV.Collection Type
Swift cung cấp cho chúng ta 3 kiểu Collection là : Array,
Set, Dictionary
- Array lưu trữ số thứ tự của các giá trị có cùng kiểu.
- Set thứ tự các giá trị duy nhất.
- Dictionary lưu trữ các giá trị cùng kiểu có thứ tự, truy
xuất thông qua một định
danh duy nhất.
//Nội suy chuỗi
let chuoi = "KhoaPham"
let tuoi = 28
let thongtin = "Tên: \(chuoi), tuổi: \(tuoi)"
//Kết quả: "Tên: KhoaPham, tuổi: 28"
//Counting Character
var ten = "KhoaPham.Vn và WePro.Vn"
print("Số Lượng: \(ten.characters.count)")
//So Sánh
let chuoi1 = "KhoaPham"
let chuoi2 = "KhoaPham"
if chuoi1 == chuoi2{
print("Hai chuỗi giống nhau")
}
//Kết quả: "Hai chuỗi giống nhau"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 20 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
A.Array(mảng)
Lưu trữ các giá trị cùng kiểu theo một danh sách có thứ tự.
Các giá trị có thể truy
xuất theo vị trí trong Array.
Các thao tác cơ bản trong Array:
//Array
//Cách 1:
var mang:[Int] = [1, 2, 3]
//Cách 2:
var mang2 = [Int]()
mang2.append(1)
mang2.append(2)
mang2.append(3)
//Cách thêm phần tử cho mang
mang.append(4)
//Kết quả: [1,2,3,4]
//Lấy giá trị
print("Số: \(mang[1])")
//Kết quả: "Số: 2"
//Xoá vị trí phần tử trong mang
mang.removeAtIndex(2) //Vị trí 2 là số 3
print(mang)
//Kết quả: [1,2,4]
//Thêm một phần tử vào mang tại vị trí nhất định
mang.insert(5, atIndex: 2)
//Kết quả: [1,2,5,4]
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 21 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
1.Iterating Over an Array(Duyệt qua một mảng)
Nếu bạn muốn lấy giá trị và vị trí của phần tử thì bạn có thể
như sau:
B.Set
Set là một kiểu Collection mới có trong Swift 2.0.
Set lưu trữ những giá trị khác nhau có cùng kiểu nhưng không
có thứ tự rõ ràng.Bạn
có thể sử dụng để thay thế Array khi thứ tự của các giá trị
là không quan trọng, hoặc
khi bạn muốn các giá trị chỉ xuất hiện một lần.
1.Thao tác cơ bản
//Duyệt qua một mang
for phantu in mang{
print(phantu)
}
//Kết quả: 1
//Kết quả: 2
//Kết quả: 5
//Kết quả: 4
for (vitri, giatri) in mang.enumerate(){
print("Phần tử \(vitri + 1): \(giatri)")
}
// Phần tử 1: 1
// Phần tử 2: 2
// Phần tử 3: 5
// Phần tử 4: 4
//khai báo và thêm phần tử
//Cách 1:
var set = Set()
set.insert("Chó")
set.insert("Mèo")
//Cách 2:
var set2:Set = ["Cúc",
"Lan", "Hồng", "Huệ"]
//Đếm số phần tử trong Set
print("Số Phần Tử: \(set2.count)")
//Kết quả: "Số Phần Tử: 4"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 22 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
ở trường hợp xoá phần tử ta nên thêm hàm if để kiểm tra xem
giá trị đó có trong Set
mà ta xoá không:
Set có một hàm để ta có thể kiểm tra xem phần tử có trong
Set hay không:
2.Performing Set Operations
Bạn có thể sử dụng Set theo các toán tử cơ bản như kết hợp
hai Set , xác định
những giá trị giống trong 2 Set...
//Remove phần tử
if let xoa = set2.remove("Lan"){
print("Đã Xoá: \(xoa)")
}else{
print("Không Có Phần Tử")
}
//Kết quả:"Đã Xoá: Lan"
//Kiểm tra có phần tử trong Set
if set2.contains("Cúc"){
print("Đã Có")
}else{
print("Chưa Có")
}
//Kết quả: "Đã Có"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 23 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
3.Set Membership and Equality
let SoLe:Set = [1,3,5,7,9]
let SoChan:Set = [0,2,4,6,8]
let giatri:Set = [0,4,9]
//Kết Hợp 2 Set lại với nhau
SoLe.union(SoChan).sort()
//Kết quả: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
//Hợp những phần tử giống nhau
SoLe.intersect(SoChan).sort()
//Kết quả: []
//Những phần tử riêng biệt của Set SoLe so vơi Set giatri
SoLe.subtract(giatri).sort()
//Kết quả: [1,3,5,7]
//Hợp 2 Set lại và bỏ những phần tử giống nhau
SoLe.exclusiveOr(giatri).sort()
//Kết quả: [0,1,3,4,5,7]
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 24 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Hình trên cho ta thấy có 3 Set a,b,c chồng chéo lên nhau.
Set b nằm trong set a và
Set a giao nhau với Set b ta sẽ có những quan hệ sau:
C.Dictionary
Lưu trữ nhiều giá trị cùng kiểu, giá trị của các kiểu giống
như Array nhưng không có
thứ tự nhất định. Mỗi giá trị được liên kết thông qua một
key duy nhất. Bạn sử dụng
một từ điển khi bạn cần tìm ra giá trị dựa trên nhận dạng của
chúng, theo cách
giống như một từ điển thực tế được sử dụng để tìm định nghĩa
cho một từ cụ thể.
Những thao tác cơ bản trong Dictionary:
let a:Set = ["Hồng", "Cúc", "Huệ",
"Lan", "Hướng Dương"]
let b:Set = ["Cúc", "Huệ",
"Lan"]
let c:Set = ["Hồng", "Hướng Dương",
"Sen", "Súng"]
//Kiểm tra b nằm trong a
b.isSubsetOf(a)
//Kết quả: true
//Kiểm tra a bao b
a.isSupersetOf(b)
//Kết quả: true
//Kiểm tra b có giao với c
b.isDisjointWith(c)
//Kết quả: true
//Khai báo Dictionary
//Cách 1:
var dictionary = [Int: String]()
dictionary[1] = "KhoaPham"
//Cách 2:
var dictionary2: [String: String] =
["True":"Đúng","False":"Sai","Do":"Làm","Why":"Tại
sao"]
//Lấy phần tử
print(dictionary2["True"]!)
//Kết quả: "Đúng"
//Đếm phần tử trong Dictionary
print("Số phần tử: \(dictionary2.count)")
//Kết quả: "Số phần tử: 4"
//Thêm phần tử
dictionary2["Go"] = "Đi"
print(dictionary2)
//Kết quả: "[Go: Đi, False: Sai, True: Đúng, Do: Làm,
Why: Tại sao]"
//Xoá phần tử
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 25 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
V.Control Flow
A.For-In
Bạn có thể sử dụng vòng lặp để duyệt qua các phần tử, các phần
tử trong mảng,
các kí tự trong chuỗi...
Vòng lặp duyệt từ 0 đến 3:
for index in 0...3{
print("KhoaPham\(index)")
}
//Kết quả: KhoaPham0
//Kết quả: KhoaPham1
//Kết quả: KhoaPham2
//Kết quả: KhoaPham3
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 26 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Vòng lặp duyệt qua các phần tử trong mảng:
Vòng lặp duyệt qua các ký tự trong chuỗi:
//Duyệt qua các phần tử trong mảng
let danhsachten =
["Ronaldo","Messi","Ronaldinho"]
for ten in danhsachten{
print(ten)
}
//Kết quả: Ronaldo
//Kết quả: Messi
//Kết quả: Ronaldinho
for kytu in "KhoaPham".characters{
print(kytu)
}
//Kết quả: K
//Kết quả: h
//Kết quả: o
//Kết quả: a
//Kết quả: P
//Kết quả: h
//Kết quả: a
//Kết quả: m
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 27 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
B.While Loops
1.While
2.Repeat-While
Repeat-While là vòng lặp sẽ hoạt động khi điều kiện While vẫn
còn thoả.
3.If
Câu lệnh điều kiện đơn giản. Khi điều kiện đúng nó sẽ thực
hiện một tập lệnh này,
khi điều kiện sai sẽ thực hiện một tập lệnh khác.
//While
var so = 0
var ketqua = 6
while so < ketqua{
so = so + 1
print(so)
}
//Kết quả: 1
//Kết quả: 2
//Kết quả: 3
//Kết quả: 4
//Kết quả: 5
//Kết quả: 6
//Repeat-While
var a = 0
repeat{
a = a + 1
print(a)
} while a < 4
//Kết quả: 1
//Kết quả: 2
//Kết quả: 3
//Kết quả: 4
//IF
var x = 2
if x == 2{
print("x = 2")
}else{
print("x != 2")
}
//Kết quả: "x = 2"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 28 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
4.Swich
Một lệnh switch xem xét một giá trị và so sánh nó với một số
mô hình phù hợp có
thể. Sau đó nó thực hiện một khối mã code thích hợp, dựa
trên mô hình đầu tiên mà
sự phù hợp thành công. Một lệnh switch cung cấp một thay thế
cho lệnh if để hồi
đáp cho nhiều trạng thái tiềm năng. Mỗi Swich gồm nhiều
Case.
5.Where
Một switch case có thể sử dụng where để kiểm tra điều kiện bổ
sung.
var y = 3
if y == 1{
print("y == 1")
}else if y == 2{
print("y == 2")
}else if y == 3{
print("y == 3")
}else{
print("y > 3")
}
//Kết quả: "y == 3"
var z = 3
switch z{
case 0:
print("z = 0")
case 1:
print("z = 1")
case 2:
print("z = 2")
case 3:
print("z = 3")
default:
print("z > 3")
}
//Kết quả: "z = 3"
let wh = (1,4)
switch wh{
case let(x,y) where x == y:
print("\(x) = \(y)")
case let(x,y) where x > y:
print("\(x) > \(y)")
case let(x,y) where x < y:
print("\(x) < \(y)")
}
//Kết quả: "1 < 4"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 29 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
C.Control Transfer Statements
Gồm : continue, break, fallthrough, return, throw.
1.Continue
Câu lệnh continue nói với một vòng lặp dừng hành động nó
đang thực hiện và bắt
đầu lại tại điểm bắt đầu của việc duyệt qua vòng lặp tiếp
theo.
2.Break
Lệnh break kết thúc việc thực hiện của toàn bộ lệnh chuyển
điều khiển ngay lập tức.
Lệnh break có thể được sử dụng bên trong lệnh switch, hoặc lệnh
lặp khi bạn muốn
chấm dứt việc thực hiện của lệnh switch hoặc lệnh lặp sớm
hơn nếu không phải là
trường hợp.
3.Fallthrough
let chuoi = "say you do"
var catchuoi = ""
for kitu in chuoi.characters{
switch kitu{
case "a","o"," ":
continue
default:
catchuoi.append(kitu)
}
}
print(catchuoi)
//Kết quả: "syyud"
//Break
let bre = 1
switch bre{
case 1:
print("bre = 1")
default:
break
}
let soF = 5
var chuoiF = ""
switch soF{
case 2, 5, 6, 7:
chuoiF += "Ket Qua \(soF)"
fallthrough
default:
chuoiF += " Chay"
}
print(chuoiF)
//Kết quả: "Ket Qua 5 Chay"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 30 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
VI.Function
Hàm(function) là khối mã khép kín dùng để thực hiện một tác
vụ cụ thể. Bạn 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-C-style
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. Bạn 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.
A.Defining and Calling Functions
B.Function Parameters and Return Values
C.Func không có kiểu trả về
//Khai Báo
func say()->String{
let name = "KhoaPham"
return name
}
//Gọi hàm
print(say())
//Kết quả: "KhoaPham"
//func không có kiểu trả về
func hello(){
let hel = "Hello, KhoaPham"
}
//Kết quả: "Hello, KhoaPham"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 31 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
D.Func có kiểu trả về
E.Func nhận tham số và có kiểu trả về
F.Func nhận nhiều tham số và có kiểu trả về
G.Func đếm kí tự trong chuỗi
//func có kiểu trả về
func hello2()->String{
let hel = "Hello, KhoaPham"
return hel
}
//nhận kiểu trả về
var chuoi = hello2()
print(chuoi)
//Kết quả: "Hello, KhoaPham"
//func nhận tham số kiểu String và trả về 1 biến có kiểu
String
func sayHello(chuoi:String) -> String{
let chuoi2 = "Hello, \(chuoi)"
return chuoi2
}
var string = sayHello("Lam")
print(string)
//Kết quả: "Hello, Lam"
//func nhận nhiều tham số và trả về biến có kiểu String
func sayThongTin(chuoi:String, tuoi:Int) -> String{
let chuoi1 = "Hello, \(chuoi) Tuổi: \(tuoi)"
return chuoi1
}
var string2 = sayThongTin("Lam", tuoi: 22)
print(string2)
//Kết quả: "Hello, Lam Tuổi 22"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 32 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
H.Func trả về nhiều giá trị
I.Func nhiều tham số Variadic
//func trả về nhiều giá trị
func timMinMax(mang:[Int])->(min:Int,max:Int){
var valueMin = mang[0]
var valueMax = mang[0]
for value in mang[1..
if value < valueMin{
valueMin = value
}else if value > valueMax{
valueMax = value
}
}
return (valueMin,valueMax)
}
var MinMax = timMinMax([2,3,4,5,6,7,8,10])
print("Min:\(MinMax.min), Max:\(MinMax.max)")
//Kết quả: "Min: 2, Max: 10"
//func nhiều tham sô Variadic
func tinhTrungBinh(number:Double...) -> Double{
var tong:Double = 0
for so in number{
tong += so
}
return tong / Double(number.count)
}
var soDouble:Double = tinhTrungBinh(2,3,6,7,8)
//Kết quả: 5.2
//func đếm kí tự trong chuỗi
func demkitu(chuoi:String) ->Int{
return chuoi.characters.count
}
var so = demkitu("KhoaPham")
//Kết quả: 8
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 33 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
J.Func InOut
K.Biến bằng Func
VII.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 bạn. 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 cho bạn.
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.
//func InOut
func doiViTri(inout so1:Int, inout _ so2:Int){
let temporary = so1
so1 = so2
so2 = temporary
}
var a = 200
var b = 150
doiViTri(&a, &b)
print("so a = \(a), b = \(b)")
//Kết quả: a = 150, b = 200
//Biến = func
func tong2So(a:Int, b:Int) ->Int{
return a+b
}
func tich2So(a:Int, b:Int) ->Int{
return a*b
}
var PhepTong = tong2So
print("Tong: \(PhepTong(3,b: 5))") //kết quả: 8
PhepTong = tich2So
print(PhepTong(3,b: 5)) //kết quả: 15
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 34 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
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
1.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 bạn
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.
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.
2.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à
tham 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 bạn đặ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ểu
let names = ["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
})
//Kết quả: false
//Kết quả: true
//Kết quả: true
//Kết quả: true
//Kết quả: false
//Kết quả: true
//Kết quả: true
//Kết quả: true
//Kết quả: false
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 35 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
tham số và các kiểu trả về.
VIII.Enumeration(Liệt Kê)
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 bạn 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 bạn.
Nếu bạn đã quen thuộc với C, bạn 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. Bạn 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ó.
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.
1.Enumeration Syntax
2.Matching Enumeration Values with a Switch Statement
//khai báo enum
//cách 1
enum testEnum{
case Trai
case Phai
case Tren
case Duoi
}
//cách 2
enum testEnum2{
case Dong,Tay,Nam,Bac
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 36 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Ta có thể kết hợp kiểu enumeration với Switch như sau:
IX.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 của bạn. Bạn
đị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 của bạn 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 bạn 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, bạn đị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.
1.Comparing Classes and 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.
- 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 bạn 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.
var timduong = testEnum.Phai
switch timduong{
case .Trai:
print("Bên Trái")
case .Phai:
print("Bên Phải")
case .Tren:
print("Ở Trên")
case .Duoi:
print("Ở Dưới")
//Kết quả: "Bên Phải"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 37 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
- Reference counting cho phép nhiều hơn một tham chiếu đến một
thể hiện lớp.
Ví dụ: Struct và Class:
B.Class and Structure Instances
Bạn có thể nhận các giá trị trong class và struct:
Thay đổi giá trị trong Class và Struct:
//Khai Báo
class AClass{
}
struct AStruct {
}
struct AStruct {
var a = 0
var b = 3
}
class AClass{
var BStruct = AStruct()
var kieuBool = true
var a = 0.3
var chuoi:String?
}
//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ị
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"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 38 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
X.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. Bạn 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.
A.Subscript Syntax
Subscripts cho phép bạn 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. Bạ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:
Ví dụ Subcript chỉ đọc:
//Subscript đọc và ghi
subscript(index: Int) -> Int{
get{
//Return giá trị thích hợp
}
set(giatri){
//Thực hiện những
}
}
//subscript chỉ đọc
subscript(index: Int)->Int{
//Return giá trị thích hợp
}
//subscript chỉ đọc
struct AStruct {
let a:Int
subscript(index: Int)-> Int{
return a * index
}
}
let b = AStruct(a: 3)
print("\(b[3])")
//Kết quả: "9"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 39 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
XI.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 đè của bạn 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.
A.Defining a Base Class
XII.Property
Property là thuộc tính của một đối tượng.
XIII.Method
//Kế thừa
class AClass{
var a = 5
var name: String{
return "KhoaPham.Vn, số: \(a)"
}
func tinh(){
}
}
let BClass = AClass()
print("\(BClass.name)")
//Kết quả: "KhoaPham.Vn, số: 5"
class Nguoi {
var ten:String = ""
var tuoi:Int = 0
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 40 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Method là những function liên quan tới đối tượng đó.
A.Subclass(lớp con)
Lớp con (Subclassing) là hành động của một lớp mới dựa trên
một lớp hiện có. Các
lớp con thừa hưởng những đặc tính từ lớp hiện có, sau đó bạn
có thể tinh chỉnh.
Bạn cũng có thể thêm các đặc tính mới cho các lớp con.
Để chỉ ra rằng một lớp con có một lớp cha, viết tên lớp con
trước tên lớp cha, cách
nhau bằng dấu hai chấm:
Ví dụ:
B.Overriding(ghi đè)
Bạn có thể ghi đè lên một thể hiện hay thuộc tính lớp thừa kế
để cung cấp getter và
class SomeSubclass: SomeSuperclass {
// subclass definition goes here
}
//SubClass
class CClass: AClass{
var b = 10
func tinh()-> Int {
return a + b
}
}
let getClass = CClass()
print("\(getClass.tinh())")
//Kết quả: "15"
//Ghi đè
class classOveride:CClass{
override var name: String{
return super.name + ", WePro.Vn, số: \(b)"
}
}
let over = classOveride()
print("\(over.name)")
//Kết quả: "KhoaPham.Vn, số: 5, WePro.Vn, số: 10"
class Nguoi {
var ten:String = ""
var tuoi:Int = 0
func di(){
...
}
func an(){
...
}
func ngu(){
...
}
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 41 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
setter tùy chỉnh của riêng bạn cho thuộc tính đó, hoặc để
thêm quan sát thuộc tính
để cho phép thuộc tính ghi đè để quan sát khi giá trị thuộc
tính ngầm thay đổi.
C.Preventing Overrides(Ngăn ghi đè)
Bạn có thể ngăn chặn một phương thức, thuộc tính, hoặc
subscript bị ghi đè bằng
cách đánh dấu nó như là final – cuối cùng. Làm điều này bằng
cách viết các sửa đổi
final trước từ khoá giới thiệu của phương thức, thuộc tính,
hoặc subscript (như final
var, final func, final class func, và final subscript).
Bất kỳ nỗ lực để ghi đè lên một thức phương thức, thuộc
tính, hoặc subscript trong
một lớp con được báo cáo như là một lỗi biên dịch thời gian.
Phương thức, thuộc
tính, hay subscript mà bạn thêm vào một lớp trong một phần mở
rộng cũng có thể
được đánh dấu như là cuối cùng trong định nghĩa của phần mở
rộng.
Bạn có thể đánh dấu toàn bộ một lớp như là cuối cùng bằng
cách viết chỉnh sửa
final trước từ khoá class trong lớp nó định nghĩa (final
class). Bất kỳ thực thi trên lớp
con, một lớp cuối cùng, được báo cáo như là một lỗi thời
gian biên dịch.
XIV.Initialization(Khởi tạo)
Init là bắt buộc khởi tạo những thuộc tính của đối tượng,
khi đối tượng đó được khởi
tạo.
Ở ví dụ trên khi khởi tạo đối tượng nguoi1 thì nó bắt buộc
ta phải truyền 2 tham số
Ten và Tuoi vì trong class Nguoi ta khởi tạo hàm init. Còn
nguoi2 sẽ báo lỗi do ta
chưa truyền vào 2 tham số Ten và Tuoi.
XV.Deinitialization(Hàm Huỷ)
class Nguoi {
var ten:String = ""
var tuoi:Int = 0
init(Ten:String, Tuoi:Int){
ten = Ten
tuoi = Tuoi
}
}
var nguoi2:Nguoi = Nguoi() //Missing argument for parameter
'Ten' in call
var nguoi1:Nguoi = Nguoi(Ten: "Le Lam", Tuoi: 26)
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 42 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
Một deinitializer được gọi là ngay trước khi một thể hiện lớp
được giải phóng. Bạn
viết deinitializers với từ khóa deinit, tương tự như cách bộ
khởi tạo – intializers –
được viết với từ khóa init. Deinitializers chỉ có sẵn trên
các kiểu lớp.
XVI.Optional Chaining
Optional Chaining là một quá trình để truy vấn và gọi các
property, method, và
subscript vào một optional mà hiện tại có thể là nil. Nếu
optional có chứa một giá trị,
class Nguoi {
var ten:String = ""
var tuoi:Int = 0
init(Ten:String, Tuoi:Int){
ten = Ten
tuoi = Tuoi
}
deinit{
print("Giá trị nil")
}
}
var nguoi1:Nguoi = Nguoi(Ten: "Le Lam", Tuoi: 26)
var nguoi2:Nguoi? = Nguoi(Ten: "KhoaPham", Tuoi:
28) //Nguoi2 có giá trị
nguoi2 = nil //đã được giải phóng và thực thi các câu lệnh
trong deinit
class Nguoi{
var Ten:String = "Lam"
var Tuoi:Int = 26
}
class Nha{
var nguoi:Nguoi?
}
//Gọi gián tiếp
let nha = Nha()
if let nguoi = nha.nguoi?.Ten{
print("Tên: \(nguoi)")
}else{
print("nguoi có giá trị nil")
}
//kết quả: "nguoi có giá trị nil"
//Gọi trực tiếp
nha.nguoi = Nguoi()
if let nguoi = nha.nguoi?.Ten{
print("Tên: \(nguoi)")
}else{
print("nguoi không có giá trị")
}
//kết quả: "Tên: Lam"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 43 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
thuộc tính, phương thức, hoặc kí hiệu gọi thành công; nếu
optional là nil, thuộc tính,
phương thức, hoặc kí hiệu gọi trả về nil. Nhiều truy vấn có
thể được nối lại với nhau,
và toàn bộ chuỗi thất bại nếu bất kỳ liên kết trong chuỗi là
nil.
Khi gọi gián tiếp do nha.nguoi?.Ten ta khai báo có dấu “?”
nên giá trị là nil
Còn khi gọi trực tiếp nha.nguoi = Nguoi() lúc này đã có giá
trị
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 44 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
XVII.Handling Error
Là quá trình xử lý lỗi và khắc phục từ các lỗi trong chương
trình. Swift đã cung cấp
first-class hỗ trợ việc ta xuất lỗi, bắt lỗi, tuyên truyền
và khắc phục lỗi khi chạy.
A.Representing Errors
Enumeration đặc biệt thích hợp để mô hình hoá một nhóm các
điều kiện lỗi, với các
giá trị liên quan để biết thêm về bản chất của một lỗi được
truyền vào.
B.Throwing Errors
Chỉ ra functionn hoặc method có thể ném ra lỗi.
C.Catching and Handling Errors
enum loiMaHoa:ErrorType{
case Empty
case Short
}
func mahoaPassword(str:String, password:String) throws
->String{
guard password.characters.count > 0 else{throw
loiMaHoa.Empty}
guard password.characters.count >= 6 else{throw
loiMaHoa.Short}
let mahoa = password + str + password
return String(mahoa.characters.sort())
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 45 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
ở đây nếu str = “” thì sẽ xuất ra lỗi Empty.
do{
let chuoimahoa = try mahoaPassword("Lam",
password: "123456")
print(chuoimahoa)
}catch loiMaHoa.Empty{
print("Bo Trong")
}catch{
print("Loi Phat Sinh")
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 46 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
XVIII.Tổng hợp những điểm khác trong Swift 2.0
A.Defer
B.Repeat-While
C.Continue
//defer
func printABC(a:String, b:String, c:String){
print(a)
defer{
print(b)
}
print(c)
}
printABC("A", b: "B", c: "C")
//Kết Quả : “A” “C” “B”
//Repeat-While
var a = 0
repeat{
a = a + 1
print(a)
} while a < 4
//Kết quả: 1
//Kết quả: 2
//Kết quả: 3
//Kết quả: 4
let chuoi = "say you do"
var catchuoi = ""
for kitu in chuoi.characters{
switch kitu{
case "a","o"," ":
continue
default:
catchuoi.append(kitu)
}
}
print(catchuoi)
//Kết quả: "syyud"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 47 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
D.Where
E.Fallthrough
F.Guard
//where
let wh = (1,4)
switch wh{
case let(x,y) where x == y:
print("\(x) = \(y)")
case let(x,y) where x > y:
print("\(x) > \(y)")
case let(x,y) where x < y:
print("\(x) < \(y)")
}
//Kết quả: "1 < 4"
//Fallthrough
let soF = 5
var chuoiF = ""
switch soF{
case 2, 5, 6, 7:
chuoiF += "Ket Qua \(soF)"
fallthrough
default:
chuoiF += " Chay"
}
print(chuoiF)
//Kết quả: "Ket Qua 5 Chay"
guard a == b else{
print("Khác Nhau")
return
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 48 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
G.Set
1.Khai Báo
2.Đếm Phần tử
3.Xoá Phần tử
4.Kiểm tra phần tử
//Cách 1:
var set = Set()
set.insert("Chó")
set.insert("Chó")
//Cách 2:
var set2:Set = ["Cúc",
"Lan", "Hồng", "Huệ"]
//Đếm số phần tử trong Set
print("Số Phần Tử: \(set2.count)")
//K if let ết qu xoa = ả: "Số set2 Phầ .remove n Tử:
4" ("Lan"){
print("Đã Xoá: \(xoa)")
}else{
print("Không Có Phần Tử")
}
//Kết quả:"Đã Xoá: Lan"
if set2.contains("Cúc"){
print("Đã Có")
}else{
print("Chưa Có")
}
//Kết quả: "Đã Có"
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 49 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
5.Toán tử cơ bản
6. Set Membership and Equality
let SoChan:Set = [0,2,4,6,8]
let giatri:Set = [0,4,9]
//Kết Hợp 2 Set lại với nhau
SoLe.union(SoChan).sort()
//Kết quả: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
//Hợp những phần tử giống nhau
SoLe.intersect(SoChan).sort()
//Kết quả: []
//Những phần tử riêng biệt của Set SoLe so vơi Set giatri
SoLe.subtract(giatri).sort()
//Kết quả: [1,3,5,7]
//Hợp 2 Set lại và bỏ những phần tử giống nhau
SoLe.exclusiveOr(giatri).sort()
//Kết quả: [0,1,3,4,5,7]
let b:Set = ["Cúc", "Huệ",
"Lan"]
let c:Set = ["Hồng", "Hướng Dương",
"Sen", "Súng"]
//Kiểm tra b nằm trong a
b.isSubsetOf(a)
b.isSubsetOf(a)
//Kiểm tra a bao b
a.isSupersetOf(b)
//Kết quả: true
//Kiểm tra b có giao với c
b.isDisjointWith(c)
//Kết quả: true
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 50 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
H.Handling Error
1.Enum
2.Throws
3.Do-Catch
Để học khoá đầy đủ và chuyên sâu hơn bạn có thể tham gia
khoá học
lập trình iOS tại trung tâm đào tạo tin học KhoaPham.
Khoá học iOS cơ bản:
http://khoapham.vn/khoa-hoc-laptrinhios.html
Khoá học iOS nâng cao:
http://khoapham.vn/lap-trinh-ios-nang-cao.html
//Enum
enum loiMaHoa:ErrorType{
case Empty
case Short
}
//Func có thể phát sinh lỗi
func mahoaPassword(str:String, password:String) throws ->String{
guard password.characters.count > 0 else{throw
loiMaHoa.Empty}
guard password.characters.count >= 6 else{throw
loiMaHoa.Short}
let mahoa = password + str + password
return String(mahoa.characters.sort())
}
//thực hiện bắt lỗi
do{
let chuoimahoa = try mahoaPassword("Lam",
password: "123456")
print(chuoimahoa)
}catch loiMaHoa.Empty{
print("Bo Trong")
}catch{
print("Loi Phat Sinh")
}
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 51 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
SWIFT 2.0 TRUNG TÂM ĐÀO TẠO TIN HỌC KHOA PHẠM
Page 52 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội
Bộ
0 nhận xét:
Đăng nhận xét