- Bài 1: Tổng quan ngôn ngữ Swift
- Bài 2: Hướng dẫn cài đặt Xcode và chạy một playground
- Bài 3: Những cú pháp cơ bản trong swift
- Bài 4: Kiểu dữ liệu
- Bài 5: Toán tử trong ngôn ngữ lập trình Swift
- Bài 6: Câu lệnh rẽ nhánh trong swift – Decision Making
- Bài 7: Chuỗi ký tự trong Swift - Character và String
- Bài 8: Vòng lặp trong swift – Loops
- Bài 9: Mảng Array trong swift
- Bài 10: Dictionary trong swift
- Bài 11: Optional trong Swift
- Bài 12: Functions trong swift
- Bài 13: Closure trong swift
- Bài 14: Enumeration trong swift
- Bài 15: Struct trong swift
- Bài 16: Classes trong swift
- Bài 17: Properties trong swift
- Bài 18: Methods trong swift
- Bài 19: Subscripts trong swift
- Bài 20: Inheritance trong swift
- Bài 21: Initialization trong swift
- Bài 22: Deinitialization trong swift
- Bài 23: ARC trong swift
- Bài 24: Type casting trong swift
- Bài 25: Extensions trong swift
- Bài 26: Protocols trong swift
- Bài 27: Generics trong swift
- Bài 28: Access control trong swift
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
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!
- Bài 1: Tổng quan ngôn ngữ Swift
- Bài 2: Hướng dẫn cài đặt Xcode và chạy một playground
- Bài 3: Những cú pháp cơ bản trong swift
- Bài 4: Kiểu dữ liệu
- Bài 5: Toán tử trong ngôn ngữ lập trình Swift
- Bài 6: Câu lệnh rẽ nhánh trong swift – Decision Making
- Bài 7: Chuỗi ký tự trong Swift - Character và String
- Bài 8: Vòng lặp trong swift – Loops
- Bài 9: Mảng Array trong swift
- Bài 10: Dictionary trong swift
- Bài 11: Optional trong Swift
- Bài 12: Functions trong swift
- Bài 13: Closure trong swift
- Bài 14: Enumeration trong swift
- Bài 15: Struct trong swift
- Bài 16: Classes trong swift
- Bài 17: Properties trong swift
- Bài 18: Methods trong swift
- Bài 19: Subscripts trong swift
- Bài 20: Inheritance trong swift
- Bài 21: Initialization trong swift
- Bài 22: Deinitialization trong swift
- Bài 23: ARC trong swift
- Bài 24: Type casting trong swift
- Bài 25: Extensions trong swift
- Bài 26: Protocols trong swift
- Bài 27: Generics trong swift
- Bài 28: Access control trong swift