1. Type Inference (Kiểu suy luận) là gì?
Khai báo một cách nhanh chóng trong Swift. Bạn không cần viết đầy đủ kiểu dữ liệu khi khai báo biến hay hằng số, Swift có thể tự suy luận dựa theo giá trị được khởi tạo đầu tiên:
var age = 40 // Int
var age : Int = 40
2. Generics là gì?
Generics code cho phép bạn viết code linh hoạt, chức năng tái sử dụng và có thể làm việc với nhiều kiểu, tuỳ thuộc vào các yêu cầu mà bạn xác định.
Giả sử bạn muốn hoán đổi giá trị của 2 biến a, b, với cách viết không sử dụng generics:
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var num1 = 4
var num2 = 5
swapTwoInts(&num1 , &num2)
Bây giờ, giả sử bạn muốn hoán đổi hai giá trị kép hoặc hai giá trị chuỗi, bạn sẽ cần viết một hàm khác cho điều đó, vì hàm trên chỉ chấp nhận cho kiểu Int.
Điều gì sẽ xảy ra nếu chúng ta có một hàm chấp nhận bất kỳ loại giá trị nào và hoán đổi chúng, đây là những gì generics làm:
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
var num1 = 3
var num2 = 4
swapTwoValues(&num1 , &num2)
var str1 = "sdf"
var str2 = "dafdf"
swapTwoValues(&str1 , &str2)
Bây giờ bạn có thể hoán đổi bất kỳ loại giá trị nào, bạn không cần phải viết các hàm khác nhau để hoán đổi các loại giá trị khác nhau.
- T là một placeholder (trình giữ chỗ), được gọi là kiểu tham số.
Swift sử dụng mảng cũng là một loại generics type:
- Array <Element> , Dictionary<Key , Value>
3. Protocols là gì?
Protocols (giao thức) là một bản thiết kế bao gồm các phương thức, thuộc tính và các yêu cầu khác phù hợp, với một nhiệm vụ vụ thể, và nó có thể được chấp nhận bởi một class, struct hoặc enumeration.
Protocols không bao gồm việc thực thi.
Loại mà đang kế thừa protocols, cần thực thi tất cả các method được định nghĩa trong protocols. Và hành động này được gọi là conforming protocol
Ví dụ:
protocol Vehicle {
func accelerate()
func stop()
}
class Unicycle : Vehicle {
var peddling = false
func accelerate(){
peddling = true
}
func stop() {
peddling = false
}
}
4. Tuples là gì?
Đôi khi dữ liệu đi theo cặp hoặc bộ ba. Ví dụ về điều này là một cặp tọa độ (x, y) trên lưới 2D. Tương tự, một tập hợp các tọa độ trên lưới 3D bao gồm giá trị x, giá trị y và giá trị z. Trong Swift, bạn có thể biểu diễn những dữ liệu liên quan như vậy một cách rất đơn giản thông qua việc sử dụng một bộ tuple.
let coordinates: (Int, Int) = (2, 3)
5. Điều gì về tính đột biến (Mutability) trong Swift?
Hằng số (let) là không đổi và biến (var) thay đổi.
6. Supscripts là gì?
Với các subcripts, bạn có thể nhanh chóng truy cập các phần tử con của một tập hợp (collections - bộ sưu tập).
Một subscript bao gồm:
- Tên của một collections, ví dụ scores
- Hai dấu ngoặc vuông [ và ]
- Một key hoặc index bên trong dấu ngoặc
Theo mặc định, bạn có thể sử dụng chỉ số con với arrays, dictionarys, collections, lists, sequences. Bạn cũng có thể triển khai của riêng bạn như ví dụ sau:
subscript(parameterList) -> ReturnType {
get {
// trả lại someValue của ReturnType
}
set(newValue) {
// đặt lại someValue của ReturnType thành newValue
}
7. Optional là gì?
Optional là giải pháp của Swift cho vấn đề đại diện cho cả giá trị và sự vắng mặt của giá trị. Một optional được phép giữ giá trị hoặc nil.
8. Unwrap Optional bằng những cách nào?
Có thể unwrap optional bằng những cách sau:
- Bằng Optional Binding
- Bằng Force Unwrapping
- Bằng Guard Statement
- Bằng Nil Coalescing
Optional Binding (If let)
Cách đơn giản nhất để unwrap một optional:
var authorName : String? = "Mohd Yasir"
if let authorName == authorName {
print("Author name is \(authorName)")
else{
print("No Author Name")
}
Force Unwrapping
Để ép buộc unwrap, sử dụng "!"
var authorName : String? = "Mohd Yasir"
print("Auhor name : \(authorName!)")
Guard Statement
Đôi khi bạn muốn kiểm tra một điều kiện và chỉ tiếp tục thực thi một hàm nếu điều kiện là đúng, chẳng hạn như khi bạn sử dụng optionals. Hãy tưởng tượng một hàm lấy một số dữ liệu từ internet. Quá trình tìm nạp đó có thể không thành công nếu mạng gặp sự cố. Cách thông thường để đóng gói hành vi này là sử dụng một optional, có giá trị nếu tìm nạp thành công và nil nếu không thành công.
Swift có một tính năng hữu ích và mạnh mẽ để trợ giúp trong những trường hợp như thế này - câu lệnh guard let:
func testingGuard( _ name : String?){
guard let unrappedname = name else {
print("You dont entered any name")
return
}
print("Hello , \(unrappedname)")
}
Nil Coalescing
let name = String? = nil
let unwrappedName = name5 ?? "Unkonwn"
9.Loại cấp phát bộ nhớ nào diễn ra trong Swift?
Trong Stack và Heap
Khi bạn tạo một loại tham chiếu chẳng hạn như class, hệ thống sẽ lưu trữ cá thể thực tế trong một vùng bộ nhớ được gọi là heap.
Các thể hiện của một kiểu giá trị chẳng hạn như một struct nằm trong một vùng bộ nhớ được gọi là stack.
10. Sự khác biệt giữa ngăn xếp và bộ nhớ heap là gì?
Hệ thống sử dụng stack để lưu trữ bất kỳ thứ gì trên chuỗi thực thi ngay lập tức; nó được quản lý chặt chẽ và tối ưu hóa bởi CPU. Khi một hàm tạo một biến, stack sẽ lưu trữ biến đó và sau đó hủy nó khi hàm thoát. Vì stack được tổ chức rất chặt chẽ, nó rất hiệu quả và do đó khá nhanh.
Hệ thống sử dụng heap để lưu trữ các phiên bản của các loại tham chiếu. Heap thường là một nhóm bộ nhớ lớn mà từ đó hệ thống có thể yêu cầu và cấp phát động các khối bộ nhớ. Chu kỳ thời gian của nó khá là linh hoạt và năng động. Heap không tự động hủy dữ liệu của nó giống như stack; công việc bổ sung được yêu cầu để làm điều đó. Điều này làm cho quá trình tạo và xóa dữ liệu trên heap chậm hơn so với trên ngăn xếp.
Bài viết được tham khảo trên medium.
Khóa học IOS Swift cơ bản tại Techmaster: khóa học dành cho người mới bắt đầu không yêu cầu đầu vào
- Ngày khai giảng: 16/10/2020
- Thời gian học: 18:30 - 21:30 | Thứ 4 và thứ 6
- Địa điểm: tầng 12A, tòa nhà Viwaseen, số 48 Tố Hữu, Trung Văn, Nam Từ Liêm, Hà Nội
- Học phí: 3,9 triệu đồng
- Liên hệ tư vấn: Trương Minh Thúy - 0967983563 support@techmaster.vn
Bình luận