Function trong Swift
swift
51
Funtion
1
ios
42
Male avatar

knn viết ngày 26/09/2015

Functions

function = hàm, phương thức
Hàm bao gồm tham số (parameter) và kiểu trả về (return type)
Ví dụ về hàm:

    func sayHello(personName: String) -> String {
        let greeting = "Hello, " + personName + "!"   
        return greeting
    }
    print(sayHello("Henry"))

Để khai báo hàm sử dụng từ khoá func , theo sau là tên hàm và tham số. Cuối cùng là kiểu trả về. Trong đoạn code trên sayHello là tên hàm. Tham số là personName, và kiểu trả về là String.
Một hàm có thể có hoặc không có tham số và kiểu trả về.

Một điểm mới trong Swift đó là một hàm có thể trả về một lúc nhiều giá trị.

    func minMax(array: [Int]) -> (min: Int, max: Int) {
        var currentMinValue: Int = array[0];
        var currentMaxValue: Int = array[0];

        for number in numberArray {
            if currentMinValue > number {
                currentMinValue = number
            } else if currentMaxValue < number {
                currentMaxValue = number
            }
        }           
        return (currentMinValue, currentMaxValue)
    }

Hàm minMax có tham số là một mảng kiểu Int và trả về một gói gồm 2 giá trị min và max của mảng đó. Kiểu trả về này được gọi là Tuple.

Parameter Names

Một tham số có cả tên toàn cục (external parameter name) và tên cục bộ (local parameter name). Tên toàn cục được sử dụng lúc gọi hàm trong khi đó tên cục bộ được sử dụng trong hàm

NOTE:
Tên toàn cục bắt buộc phải có khi gọi hàm

    func sayHello(to person: String, and anotherPerson: String) -> String {
        return "Hello \(person) and \(anotherPerson)"
    }   

    sayHello(to: "Bill", and: "Ted")

Phương thức sayHello() có 2 tham số

  • Tham số 1 có tên toàn cục là to và tên cục bộ là person
  • Tham số 2 có tên toàn cục là and và tên cục bộ là anotherPerson

Vì vậy toand phải được gọi lúc gọi hàm

Mặc định, nếu bạn không định nghĩa tên toàn cục cho tham số. thì tham số đầu tiên sẽ không có tên toàn cục, tham số thứ 2 sẽ dùng tên cục bộ của nó làm tên toàn cục

    func someFunction(firstParameter: Int, secondParameter: Int) {

    }
    someFunction(1, secondParameter: 2)

secondParameter vừa là tên toàn cục vừa là lên cục bộ, vì vậy nó được dùng khi gọi hàm. Nếu bạn không thích điều này có thể sử dụng gạch dưới (_) để thay cho tên toàn cục của biến đó

    func someFunction(firstParameter: Int, _ secondParameter: Int) {

    }
    someFunction(1, 2)

Lúc này lời gọi hàm chỉ còn someFunction(1, 2)

Default Parameter

Với ngôn ngữ Swift bạn có thể định nghĩa một giá trị mặc định cho tham số. Đây là một điểm mới rất hay của swift giúp re-use code mà không cần phải override nhiều lần một phương thức.

    func sumInt(firstNumber: Int = 0, _ secondNumber: Int = 1) -> Int {
    let sum = firstNumber + secondNumber;
    return sum;
    }
    print(sumInt(2, 4)) // Print: 6
    print(sumInt(7))    // Print: 8
    print(sumInt())     // Print: 1

Hàm trên có 2 tham số với giá trị mặc định lần lượt là 0 và 1. Nếu truyền 1 tham số thì tham số thứ 2 sẽ lấy giá trị mặc định của nó. Nếu không truyền tham số nào thì cả 2 tham số sẽ lấy giá trị mặc định

Variadic Parameters

Tham số variadic có thể nhận 0 hoặc nhiều giá trị của 1 loại biến xác định.

    func sumDouble(numbers: Double...) -> Double {
        var total: Double = 0;
        for number in numbers {
            total += number
        }    
        return total
    }

    print(sumDouble(5,8,2.1))

Constant and Variable Parameters

Tham số của hàm được mặc định là những hằng số. Việc cố gắng thay đổi giá trị của tham số sẽ gây ra lỗi compile-time. Tuy nhiên Swift hỗ trợ một cách để sử dụng tham số như là một biến trong hàm. Bằng cách thêm từ khoá var phía trước tên biến.

    func increase(var number: Int) -> Int {
        number++
        return number
    }

    print(increase(4))

In-Out Parameters

Tham số chỉ tồn tại trong phạm vi của hàm. Nếu bạn muốn thay đổi giá trị của một tham số của hàm và sự thay đổi đó vẫn còn khi hàm kết thúc, hãy định nghĩa đó là một tham số in-out.

Khi gọi hàm phải đặt dấu (&) ngay trước tên biến để cho trình biên dịch biết biến đó có thể thay dổi trong hàm.

Note:
Một tham số in-out không thể là hằng số
Một tham số in-out không có giá trị mặc định

    func swapInts(inout a: Int, inout _ b:Int) {
        let temp = a
        a = b
        b = temp
    }

    var a: Int = 5
    var b: Int = 24

    swapInts(&a, &b);

    print("\(a)")    // Print 24
    print("\(b)")    // Print 5

Sau khi gọi hàm swapInts() giá trị của 2 biến a và b đã thay đổi cho nhau.

Function Types

Kiểu hàm (Function type) là một kiểu được thành lập từ tham số và kiểu trả về của hàm

    func addTwoInts(a: Int, _ b: Int) -> Int {
        return a + b
    }

    func multiplyTwoInts(a: Int, _ b:Int) -> Int {
        return a * b
    }

Kiểu của 2 hàm addTwoIntsmultiplyTwoInts(Int, Int) -> Int
Bạn có thể tạo một biến kiểu (Int, Int) -> Int như sau:

    var math : (Int, Int) -> Int = addTwoInts;
    print("\(math(3, 6))")    // Print 9

    math = multiplyTwoInts
    print("\(math(3, 6))")    // Print 18

Biến math được khởi tạo với kiểu (Int, Int) -> Int . Lúc này gán cho nó bằng kiểu của hàm addTwoInts thì giá trị in ra sẽ là tổng của 3 và 6.
Ở dòng tiếp theo, math được gán bằng multiplyTwoInts điều này có thể xảy ra vì multiplyTwoInts cũng là kiểu (Int, Int) -> Int. Giá trị in ra lúc này sẽ là 18

Kiểu hàm có thể được gán cho kiểu của tham số hoặc kiểu trả về

Nested Functions

Hàm có thể được khai báo bên trong một hàm khác. Hàm con chỉ có thể được sử dụng bên trong hàm mẹ. Để hàm con có thể được sử dụng bên ngoài hàm mẹ. Hàm mẹ phải sử dụng hàm con như kiểu trả về

    func chooseStepFunction(backward:Bool) -> (Int) -> Int {
        func stepForward(input: Int) -> Int {
            return input + 1
        }

        func stepBackward(input: Int) -> Int {
            return input - 1
        }

        return backward ? stepBackward : stepForward
    }

stepForwardstepBackward là 2 hàm con của chooseStepFunction. Và một trong 2 hàm con sẽ được gọi khi hàm mẹ được gọi

Kết luận

Hàm là một trong những phần có nhiều điểm mới so với Objective-C như giá trị mặc định cho tham số, tham số in-out, hàm không xác định số lượng tham số...

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

knn

3 bài viết.
11 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
11 4
Trong lúc rãnh rỗi mình custom UISwitch với animation đơn giản. Đây là nguồn của animation: https://dribbble.com/shots/2309834Yetanothertoggleanim...
knn viết hơn 2 năm trước
11 4
Male avatar
2 0
CALayer đại diện cho một hình chữ nhật có thể nhìn thấy được trên UI. Mỗi UIView đều có một layer. ObjectiveC CALayer myLayer = myView.layer; V...
knn viết 2 năm trước
2 0
Bài viết liên quan
White
11 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết gần 3 năm trước
11 4
White
0 0
RxSwift: Bài 6: RxCocoa (Part 4) Units 1. Khái niệm chung RxCocoa cung cấp nhiều tính năng mới để làm việc với Cocoa và UIKit 1 cách dễ dàng hơn....
Bùi Khánh Duy viết 18 giờ trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
11 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!