Tải bản đầy đủ - 46 (trang)
Bài 2. CƠ BẢN VỀ NGÔN NGỮ SWIFT (P2)

Bài 2. CƠ BẢN VỀ NGÔN NGỮ SWIFT (P2)

Tải bản đầy đủ - 46trang

1

2

3

4

5

6

7

8

9



func sumOf(numbers: Int...) -> Int {

var sum = 0

for number in numbers {

sum += number

}

return sum

}

sumOf()

sumOf(42, 597, 12)



Ở hàm trên, numbers được trình biên dịch ngầm hiểu là có kiểu array, do đó để tìm được giá trị

tổng thì chúng ta có thể lặp qua tất cả giá trị thành viên của array.

Bạn có thể khai báo hàm bên trong bằng 1 hàm khác, hàm trong sẽ có thể truy cập biến được

khai báo ở hàm ngoài. Việc dùng hàm bên trong hàm có ích lợi trong trường hợp hàm của bạn

dài quá hay quá phức tạp. Bạn có thể tổ chức thành những hàm nhỏ và dễ đọc hơn.



1 func returnFifteen() -> Int {

2 var y = 10

3 func add() {

4

y += 5

5 }

6 add()

7 return y

8}

9 returnFifteen()



Trong Swift thì hàm vừa có thể nhận được giá trị đầu vào là hàm khác lại vừa có thể trả về giá

trị là 1 hàm khá. Ví dụ:

Trả về giá trị là 1 hàm



1

2

3

4

5

6

7

8



func makeIncrementer() -> (Int -> Int) {

func addOne(number: Int) -> Int {

return 1 + number

}

return addOne

}

var increment = makeIncrementer()

increment(7)



Nhận giá trị tham số là 1 hàm khác:



7



1

2

3

4

5

6

7

8

9

10

11

12

13



func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {

for item in list {

if condition(item) {

return true

}

}

return false

}

func lessThanTen(number: Int) -> Bool {

return number < 10

}

var numbers = [20, 19, 7, 12]

hasAnyMatches(numbers, lessThanTen)



Swift có đưa ra khái niệm mới gọi là Closure. Bản chất của Closure chính là 1 đoạn code được

giới hạn bởi cặp dấu {}. Hàm thực chất chính là trường hợp đặc biệt của Closủe. Khi sử dụng

Closure bạn cũng có thể không cần dùng tên như bắt buộc dùng từ khóa “in” trong closure đó.

Ví dụ:



1 numbers.map({ (number: Int) -> Int in

2 let result = 3 * number

3 return result

4 })

Closure có thể được đơn giản hoá như thế này:



1 let mappedNumbers = numbers.map({ number in 3 * number })

Việc dùng Closure hiệu quả sẻ làm cho app của bạn ngắn gọn hơn nhưng bạn sẽ cần thêm thời

gian để làm quen với khái niệm này. Closure sẽ được bàn kỹ hơn ở những bài sau nhé.

2. Class trong Swift.

Giống với Java và C++ để có thể khai báo 1 lớp các bạn sử dụng từ khóa class. Những đặc tính

và Method thành viên được khai báo 1 cách bình thường.



8



1 class Shape {

2 var numberOfSides = 0

3 func simpleDescription() -> String {

4

return "A shape with \(numberOfSides) sides."

5 }

6}



Để truy cập biến và hàm, bạn phải dùng dấu chấm “.”



1 var shape = Shape()

2 shape.numberOfSides = 7

3 var shapeDescription = shape.simpleDescription()

Bạn có thể thêm vào đó hàm init để khởi tạo được giá trị cho biến thành viên của lớp như sau:



1 class NamedShape {

2

var numberOfSides: Int = 0

3

var name: String

4

5

init(name: String) {

6

self.name = name

7

}

8

9

func simpleDescription() -> String {

10

return "A shape with \(numberOfSides) sides."

11 }

12 }



Để kế thừa 1 lớp cha, bạn có thể dùng dấu “:”. Để override một method trong lớp cha bạn sử

dụng từ khoá “override”:



1 class Square: NamedShape {

2

var sideLength: Double

3

4

init(sideLength: Double, name: String) {

5

self.sideLength = sideLength



9



6

7

8

9

10

11

12

13

14

15

16

17

18

19

20



super.init(name: name)

numberOfSides = 4

}

func area() -> Double {

return sideLength * sideLength

}

override func simpleDescription() -> String {

return "A square with sides of length \(sideLength)."

}

}

let test = Square(sideLength: 5.2, name: "my test square")

test.area()

test.simpleDescription()



Giống như trong Objective-C, bạn có thể viết setter & getter cho bất kỳ một property nào của

1 class. Bạn sử dụng từ khoá “set” cho setter & “get” cho getter. Bạn cũng có thể sử dụng

những method “willSet” và “didSet” để có thể chèn thêm vào 1 số đoạn code cần thiết trước &

sau khi set giá trị cho 1 property. Chi tiết về việc dùng setter và getter mình sẽ đề cập trong

những phần tiếp theo.

Một điểm bạn cần lưu ý đó là sự khác biệt giữa method được khai báo bên trong một lớp và

một hàm. Tham số đầu vào của hàm chỉ được dùng trong nội bộ hàm nhưng tham số của

method có thể được dùng khi gọi method đó. Mặt khác có thể khai báo thêm tên cho một tham

số như dưới đây:



1

2

3

4

5

6

7

8



class Counter {

var count: Int = 0

func incrementBy(amount: Int, numberOfTimes times: Int) {

count += amount * times

}

}

var counter = Counter()

counter.incrementBy(2, numberOfTimes: 7)



Đến đây bạn đã nắm được thêm khá nhiều khái niệm và cách sử dụng trong lập trình với Swift.

Swift quả thực là một ngôn ngữ vô cùng linh hoạt và cung cấp cho bạn thêm nhiều tính năng

mới mẻ mà các ngôn ngữ lập trình khác không có. Chúc các bạn học tốt.



10



BÀI 3. CĂN BẢN VỀ LẬP TRÌNH SWIFT (P3)

Ở hai phần trước thì mình đã cùng các bạn tìm hiểu về hàm và class của Swift. Hôm nay mình

sẽ giới thiệu 2 khái niệm khá cơ bản gồm Enumerations, Structures, Protocols và Extensions.

Bài viết này sẽ là bài cuối cùng trong series bài giới thiệu về ngôn ngữ lập trình Swift. Những

bài sau chúng ta sẽ tập trung vào cách dùng chi tiết cùng với những framework trong lập trình

iOS.

1. Enumerations

Trong Java, C, C++, Objective C hay các ngôn ngữ lập trình khác, kiểu enum dùng để khai

báo một tập giá trị cho trước, trong đó thì mỗi giá trị sẽ tương ứng với một số nguyên. Trong

Swift thì khái niệm enum lại được mở rộng ra với việc cho phép khai báo hàm trong enum.

Hơn nữa, mỗi một giá trị trong enum đều không nhất thiết cần phải là số nguyên mà hoàn toàn

có thể là số thực, chuỗi (String), hoặc có thể không khai báo tường minh.

Để khai báo ta sử dụng từ khoá “enum”



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21



enum Rank: Int {

case Ace = 1

case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten

case Jack, Queen, King

func simpleDescription() -> String {

switch self {

case .Ace:

return "ace"

case .Jack:

return "jack"

case .Queen:

return "queen"

case .King:

return "king"

default:

return String(self.toRaw())

}

}

}

let ace = Rank.Ace

let aceRawValue = ace.toRaw()



Ở ví du jtrên thì kiểu giá trị là Int. Vì vậy aceRawValue sẽ có giá trị là 1.

Hãy chú ý là bạn sử dụng hàm toRaw (hoặc rawValue) và fromRaw để convert giữa giá trị

enum và giá trị thực của nó (ở đây là Int).

Cùng xem đoạn code sau:



11



1 iflet convertedRank = Rank(rawValue: 11) {

2 let threeDescription = convertedRank.simpleDescription()

3}



Giá trị 11 đã được chuyển đổi thành giá trị enum .Jack. Như vậy, giá trị threeDescription sẽ có

giá trị là “jack”.

Khi khai báo kiểu enum thì bạn không cần nhất thiết phải khai báo theo kiểu giá trị thô (raw

value) của những thành viên. Đoạn code sau đây sẽ minh hoạ điều này:



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17



enum Suit {

case Spades, Hearts, Diamonds, Clubs

func simpleDescription() -> String {

switch self {

case .Spades:

return "spades"

case .Hearts:

return "hearts"

case .Diamonds:

return "diamonds"

case .Clubs:

return "clubs"

}

}

}

let hearts = Suit.Hearts

let heartsDescription = hearts.simpleDescription()



Code đoạn code phía trên rồi chạy trên 1 playground, bạn có thể được giá trị “hearts” cho hằng

heartsDescription.

Một điểm rất đặc biệt trong kiểu enum của Swift đó là nó sẽ cho phép khai báo thành viên như

một macro trong C++. Cùng xem qua đoạn code sau:



1

2

3

4

5

6

7

8



enum ServerResponse {

case Result(String, String)

case Error(String)

}

let success = ServerResponse.Result("6:00 am", "8:09 pm")

let failure = ServerResponse.Error("Out of cheese.")



12



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Bài 2. CƠ BẢN VỀ NGÔN NGỮ SWIFT (P2)

Tải bản đầy đủ ngay(46 tr)

×