• No se han encontrado resultados

Habilitación y Rescate de Espacios Públicos

CAPÍTULO 5. De los lineamientos por vertiente

5.2.2. Habilitación y Rescate de Espacios Públicos

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 }

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"

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"

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"

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

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{ overridevar name: String{

returnsuper.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(){ ... } }

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

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()

iflet 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()

iflet nguoi = nha.nguoi?.Ten{ print("Tên: \(nguoi)")

}else{

print("nguoi không có giá trị") }

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ị

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 > 0else{throw loiMaHoa.Empty}

guard password.characters.count >= 6else{throw loiMaHoa.Short}

let mahoa = password + str + password returnString(mahoa.characters.sort()) }

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") }

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)

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{

caselet(x,y) where x == y: print("\(x) = \(y)")

caselet(x,y) where x > y: print("\(x) > \(y)")

caselet(x,y) where x < y: print("\(x) < \(y)") } //Kết quả: "1 < 4" //Fallthrough let soF = 5 var chuoiF = "" switch soF{ case2, 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

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<String>() set.insert("Chó")

set.insert("Chó") //Cách 2:

var set2:Set<String> = ["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"

if

let xoa = set2.remove("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ó"

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)

Page 50 of 52 KhoaPham.Vn | Hotline: 094 276 4080 Lưu Hành Nội Bộ H.Handling Error

1.

Enum

Documento similar