Bài 12: Functions trong swift - Lập trình Swift cơ bản

Đăng bởi: Admin | Lượt xem: 3720 | Chuyên mục: Swift


Hướng dẫn khai báo hàm trong swift

Hàm trong swift được định nghĩa là một tập hợp gồm các câu lệnh thực hiện các một công việc cụ thể khi được tổ chức với nhau. Hàm trong Swift gồm có Function Declaration (khai báo hàm) và Function Definition (định nghĩa hàm).
Để hoàn thành khai báo hàm, lập trình viên cần thông báo với trình biên dịch về tên của hàm, kiểu trả về và tham số của hàm đó.

Cú pháp khai báo hàm trong swift

func funcname(Parameters list) -> Datatype {

   Statement1

   Statement2

    ---

   Statement N

   return value

}
Ví dụ khai báo và định nghĩa hàm có tên getStudentName()
func getStudentName(name: String) -> String {

   return name

}

Gọi hàm trong swift

Nếu như bạn đã quen với các ngôn ngữ lập trình khác thì các bước gọi hàm trong swift sẽ không còn xa lạ với bạn nữa, bạn sẽ đều phải cần thông qua tên hàm đúng với cấu trúc như phần khai báo hàm.

Còn nếu chưa rõ, bạn có thể tham khảo thêm ví dụ dưới đây về cách gọi hàm trong Swift nhé.
Hàm có tên getStudentName
import UIKit

func getStudentName() -> String {

   return "VN_CODER!"

}

print(getStudentName())

--> VN_CODER!

Tham số và kiểu trả về của hàm trong swift

Cũng giống như trong ngôn ngữ lập trình C và Objective – C, bạn hoàn toàn có thể khai báo hàm với nhiều giá trị và tham số khác nhau với nhiều hình thức khác nhau trong Swift một cách linh hoạt.

Hàm với một tham số

Ví dụ khai báo và định nghĩa hàm printWelcome có một tham số name kiểu chuỗi
import UIKit

func printWelcome(name: String) -> String {

	let welcome = "Welcome " + name + "!"

	return welcome

}
print(printWelcome(name: "VNCoder"))
--> Welcome VN_CODER!

Hàm với các tham số (Functions with Parameters)

Để viết hàm, bạn cần đặt chúng bên trong cặp dấu ngoặc đơn và được cách nhau bởi dấu phẩy khi có nhiều tham số đầu vào.
Ví dụ: khai báo và định nghĩa hàm add() có 2 tham số n1, n2 kiểu số nguyên (integer) và trả về kiểu integer. Khi bạn gọi hàm có nhiều hơn một tham số, những tham số thứ 2 trở đi phải được gán nhãn theo tên tham số tương ứng.
import UIKit

func add(n1: Int, n2: Int) -> Int {

   return n1 + n2

}

// Gọi hàm

print(add(2, n2: 15))

print(add(3, n2: 20))

print(add(4, n2: 25))

Kết quả bạn sẽ nhận được khi sử dụng playground để chạy chương trình trên là:

17

23

39

Hàm không có tham số (Functions without Parameters)

Cú pháp
func functionName() -> datatype {
   return datatype
}
Ví dụ khai báo và định hàm hàm getName() không có tham số và trả về chuỗi
func getName() -> String {
   return "Ro"
}

// Gọi hàm
print(getName())

Hàm có nhiều giá trị trả về (Functions with return values)

Trong swift, bạn hoàn toàn có thể khai báo hàm có nhiều giá trị trả về như  giá trị kiểu chuỗi (string), giá trị kiểu số nguyên (integer), giá trị kiểu số thực (float), …
Ví dụ để tìm số có giá trị lớn nhất và số có giá trị nhỏ nhất trong một mảng kiểu số nguyên (integer). Hàm nhận tham số là mảng và trả về giá trị lớn nhất và nhỏ nhất.
func findLS(arr: [Int]) -> (largeElement: Int, smallElement: Int) {
   var l = arr[0]
   var s = arr[0]

   for i in arr[1..<arr.count] {
      if i < s {
         s = i
      } else if i > l {
         l = i
      }
   }

   return (l, s)
}

let num = findLS([40,12,-5,78,98])
print("Số lớn nhất là: \(num.largeElement) và số nhỏ nhất là: \(num.smallElement)")

Kết quả bạn sẽ nhận được khi sử dụng playground để chạy chương trình trên là:
Số lớn nhất là: 98 và số nhỏ nhất là: -5

Hàm không trả về giá trị (Functions without return values)

Một số hàm có nhận tham số nhưng không trả về giá trị. Ví dụ sau đây khai báo hàm với 2 tham số n và m được truyền vào hàm calc(). Hàm này có nhiệm vụ tính tổng và hiệu và in kết quả.
// Khai báo và định nghĩa hàm

func calc(n: Int, m: Int) {

   let a = n + m

   let b = n - m

   print("Tổng là \(a), hiệu là \(b)")

}

// Gọi hàm

calc(10, m: 20)

calc(30, m: 40)

calc(60, m: 50)

Kết quả bạn sẽ nhận được khi sử dụng playground để chạy chương trình trên là:

Tổng là 30, hiệu là -10

Tổng là 70, hiệu là -10

Tổng là 110, hiệu là 10

Hàm với kiểu trả về tuỳ chọn (Functions with optional return types)

Nếu như bạn khai báo hàm với trả về giá trị kiểu số nguyên (integer) và hàm trả về có giá trị kiểu chuỗi (string) hoặc giá trị nil thì trình biên dịch sẽ trả về giá trị lỗi (error value).
Optional functions sẽ chấp nhận hàm trả về với 2 hình thức là ‘value’ và ‘nil’. Ví dụ sau đây khai báo và định nghĩa hàm findMinMax nhận vào mảng số nguyên và trả về 2 giá trị min và max trong mảng. Nếu mảng là rỗng (emplty), hàm sẽ trả về giá trị nil.
import UIKit

// Khai báo và định nghĩa hàm

func findMinMax(arr: [Int]) -> (min: Int, max: Int)? {

    if arr.isEmpty {

        return nil 

    }

    var currentMin = arr[0]

    var currentMax = arr[0]

    for value in arr[1..<arr.count] {

        if value < currentMin {

            currentMin = value

        } else if value > currentMax {

            currentMax = value

        }

    }

    return (currentMin, currentMax)

}

// Gọi hàm

var ret = findMinMax([80, -16, 20, 109, 30, 171])

if ret != nil {

 print("Số nhỏ nhất là \(ret!.min) và số lớn nhất là \(ret!.max)")

}

var myArr = [Int]()

var ret2 = findMinMax(myArr)

if ret2 != nil {

 print("Số nhỏ nhất là \(ret!.min) và số lớn nhất là \(ret!.max)")

} else {

 print("null")

}

Kết quả bạn sẽ nhận được khi sử dụng playground để chạy chương trình trên là:

Số nhỏ nhất là -16 và số lớn nhất là 171

null

Hàm trong swift – Giá trị mặc định cho tham số (Default Parameter Values)

Bạn có thể gán một giá trị sau kiểu dữ liệu để định nghĩa giá trị mặc định cho bất kỳ tham số nào trong hàm và bạn có thể bỏ qua tham số khi gọi hàm nếu một giá trị mặc định đã được định nghĩa.
// Khai báo và định nghĩa hàm

func myFunction(pwd: Int = 12) -> Int {

	return pwd + 6

}

// Gọi hàm

print(myFunction(6)) // 12

print(myFunction())  // 18

Hàm trong swift – Variadic Parameters

Khi gọi hàm, bạn có thể dùng variadic parameter để chỉ định rằng tham số được truyền với số lượng khác nhau và khai báo bằng cách chèn (…) sau kiểu dữ liệu
Bạn có thể tham khảo cách tính trung bình cộng của một dãy số có chiều dài bất kỳ để hiểu thêm nhé.
// Khai báo và định nghĩa hàm

func avg(numbers: Double...) -> Double {

	var total: Double = 0

	for n in numbers {

    	total += n

	}

	return total / Double(numbers.count)

}

// Gọi hàm

print(avg(1, 2, 3, 4, 5)) // 3.0

print(avg(3, 8.25, 18.75)) // 10.0

Hàm trong swift – Khai báo tham số In-Out (In-Out Parameters)

Đúng như tên gọi của nó, tham số của hàm mặc định là một hằng số, trình biên dịch sẽ báo lỗi khi bạn thay đổi giá trị của nó. 
Chỉ có một cách là định nghĩa cho hàm với từ khóa inout thì bạn mới có thể thay đổi được giá trị của hàm và để nó tồn tại được khi hàm kết thúc.
Ví dụ hàm hoán vị 2 số nguyên
func swap(inout a: Int, inout b: Int) {

	let t = a

	a = b

	b = t

}

Gọi hàm

var a = 10

var b = 17

// Gọi hàm

swap(&a, &b)

// Sau khi chạy him a là 17 và b là 10"

print("a = \(a), b = \(b)")

Hàm trong swift – Hàm lồng nhau (Nested functions)

Việc định nghĩa một hàm bên trong một hàm khác được gọi là nested functions hay hàm lồng nhau. Hàm được khai báo bên trong một hàm chỉ tồn tại trong hàm được định nghĩa.
func chooseStep(previous: Bool) -> (Int) -> Int {

	func moveNext(n: Int) -> Int { 

      return n + 1 

    }

	func movePrevious(n: Int) -> Int { 

      return n - 1 

    }

	return previous ? movePrevious : moveNext

}

var n = 3

let f = chooseStep(n > 0)

while n != 0 {

	print("\(n)")

	n = f(n)

}

Kết quả hiển thị trong playground

3

2

1
Bài tiếp theo: Closure trong swift >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!