Swift - Chức năng

Hàm là một tập hợp các câu lệnh được tổ chức lại với nhau để thực hiện một nhiệm vụ cụ thể. Một hàm Swift 4 có thể đơn giản như một hàm C đơn giản đến phức tạp như một hàm ngôn ngữ C Objective. Nó cho phép chúng ta truyền các giá trị tham số cục bộ và toàn cục bên trong các lời gọi hàm.

  • Function Declaration - cho trình biên dịch biết về tên, kiểu trả về và các tham số của hàm.

  • Function Definition - Nó cung cấp phần thân thực tế của hàm.

Các hàm Swift 4 chứa kiểu tham số và kiểu trả về của nó.

Định nghĩa hàm

Trong Swift 4, một hàm được định nghĩa bởi từ khóa "func". Khi một hàm mới được xác định, nó có thể nhận một hoặc một số giá trị làm 'tham số' đầu vào cho hàm và nó sẽ xử lý các hàm trong phần thân chính và trả lại giá trị cho các hàm dưới dạng đầu ra 'kiểu trả về'.

Mỗi hàm đều có tên hàm, tên này mô tả nhiệm vụ mà hàm thực hiện. Để sử dụng một hàm, bạn "gọi" hàm đó với tên của nó và chuyển các giá trị đầu vào (được gọi là các đối số) phù hợp với kiểu tham số của hàm. Tham số hàm còn được gọi là 'bộ giá trị'.

Các đối số của một hàm phải luôn được cung cấp theo cùng thứ tự với danh sách tham số của hàm và các giá trị trả về được theo sau bởi →.

Cú pháp

func funcname(Parameters) -> returntype {
   Statement1
   Statement2
   ---
   Statement N
   return parameters
}

Hãy xem đoạn mã sau. Tên của học sinh được khai báo dưới dạng chuỗi dữ liệu được khai báo bên trong hàm 'student' và khi hàm được gọi, nó sẽ trả về tên của học sinh.

func student(name: String) -> String {
   return name
}

print(student(name: "First Program"))
print(student(name: "About Functions"))

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

First Program
About Functions

Gọi một hàm

Giả sử chúng ta đã xác định một hàm có tên là "display" để xem xét ví dụ để hiển thị các số, một hàm có tên hàm là "display" được khởi tạo trước với đối số "no1" chứa kiểu dữ liệu số nguyên. Sau đó, đối số 'no1' được gán cho đối số 'a', đối số này sau đó sẽ trỏ đến số nguyên cùng kiểu dữ liệu. Bây giờ đối số 'a' được trả về hàm. Ở đây hàm display () sẽ giữ giá trị nguyên và trả về giá trị nguyên khi mỗi lần hàm được gọi.

func display(no1: Int) -> Int {
   let a = no1
   return a
}

print(display(no1: 100))
print(display(no1: 200))

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

100
200

Tham số và giá trị trả về

Swift 4 cung cấp các tham số hàm linh hoạt và các giá trị trả về của nó từ giá trị đơn giản đến phức tạp. Tương tự như của C và Objective C, các hàm trong Swift 4 cũng có thể có một số dạng.

Các chức năng với các tham số

Một hàm được truy cập bằng cách chuyển các giá trị tham số của nó vào phần thân của hàm. Chúng ta có thể chuyển các giá trị tham số đơn đến nhiều tham số dưới dạng các bộ giá trị bên trong hàm.

func mult(no1: Int, no2: Int) -> Int {
   return no1*no2
}

print(mult(no1: 2, no2: 20))
print(mult(no1: 3, no2: 15))
print(mult(no1: 4, no2: 30))

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

40
45
120

Chức năng không có tham số

Chúng tôi cũng có thể có các chức năng mà không có bất kỳ tham số nào.

Cú pháp

func funcname() -> datatype {
   return datatype
}

Sau đây là một ví dụ có một hàm không có tham số:

func votersname() -> String {
   return "Alice"
}
print(votersname())

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Alice

Các chức năng có giá trị trả lại

Các hàm cũng được sử dụng để trả về các giá trị kiểu dữ liệu chuỗi, số nguyên và float dưới dạng các kiểu trả về. Để tìm ra số lớn nhất và nhỏ nhất trong một mảng đã cho, hàm 'ls' được khai báo với các kiểu dữ liệu số nguyên lớn và nhỏ.

Một mảng được khởi tạo để chứa các giá trị số nguyên. Sau đó, mảng được xử lý và mỗi và mọi giá trị trong mảng được đọc và so sánh với giá trị trước đó của nó. Khi giá trị nhỏ hơn giá trị trước đó, nó được lưu trữ trong đối số "small", nếu không nó được lưu trữ trong đối số "large" và các giá trị được trả về bằng cách gọi hàm.

func ls(array: [Int]) -> (large: Int, small: Int) {
   var lar = array[0]
   var sma = array[0]

   for i in array[1..<array.count] {
      if i < sma {
         sma = i
      } else if i > lar {
         lar = i
      }
   }
   return (lar, sma)
}

let num = ls(array: [40,12,-5,78,98])
print("Largest number is: \(num.large) and smallest number is: \(num.small)")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Largest number is: 98 and smallest number is: -5

Các chức năng không có giá trị trả lại

Một số hàm có thể có các đối số được khai báo bên trong hàm mà không có bất kỳ giá trị trả về nào. Chương trình sau khai báoablàm đối số cho hàm sum (). bên trong chính hàm các giá trị cho các đối sốab được chuyển bằng cách gọi hàm sum () và các giá trị của nó được in ra do đó loại bỏ các giá trị trả về.

func sum(a: Int, b: Int) {
   let a = a + b
   let b = a - b
   print(a, b)
}

sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

30 20
50 40
30 24

Chức năng với các loại trả lại tùy chọn

Swift 4 giới thiệu tính năng 'tùy chọn' để giải quyết các vấn đề bằng cách giới thiệu một biện pháp an toàn. Hãy xem xét ví dụ, chúng ta đang khai báo giá trị hàm kiểu trả về là số nguyên nhưng điều gì sẽ xảy ra khi hàm trả về giá trị chuỗi hoặc giá trị nil. Trong trường hợp đó, trình biên dịch sẽ trả về một giá trị lỗi. 'tùy chọn' được giới thiệu để loại bỏ những vấn đề này.

Các hàm tùy chọn sẽ có hai dạng "value" và "nil". Chúng tôi sẽ đề cập đến 'Tùy chọn' với ký tự dành riêng cho khóa '?' để kiểm tra xem bộ tuple đang trả về giá trị hay giá trị nil.

func minMax(array: [Int]) -> (min: Int, max: Int)? {
   if array.isEmpty { return nil }
   var currentMin = array[0]
   var currentMax = array[0]
   
   for value in array[1..<array.count] {
      if value < currentMin {
         currentMin = value
      } else if value > currentMax {
         currentMax = value
      }
   }
   return (currentMin, currentMax)
}

if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
   print("min is \(bounds.min) and max is \(bounds.max)")
}

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

min is -6 and max is 109

'' Tùy chọn '' được sử dụng để kiểm tra các giá trị 'nil' hoặc rác, do đó tiêu tốn nhiều thời gian trong việc gỡ lỗi và làm cho mã hiệu quả và dễ đọc đối với người dùng.

Chức năng Tên thông số bên ngoài Vs cục bộ

Tên tham số cục bộ

Tên tham số cục bộ chỉ được truy cập bên trong hàm.

func sample(number: Int) {
   print(number)
}

Đây, funcSố đối số mẫu được khai báo là biến nội bộ vì nó được truy cập nội bộ bởi hàm sample (). Ở đây 'số' được khai báo là biến cục bộ nhưng tham chiếu đến biến được thực hiện bên ngoài hàm với câu lệnh sau:

func sample(number: Int) {
   print(number)
}

sample(number: 1)
sample(number: 2)
sample(number: 3)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

1
2
3

Tên thông số bên ngoài

Tên tham số bên ngoài cho phép chúng ta đặt tên cho một tham số hàm để làm cho mục đích của chúng rõ ràng hơn. Ví dụ dưới đây, bạn có thể đặt tên cho hai tham số hàm và sau đó gọi hàm đó như sau:

func pow(firstArg a: Int, secondArg b: Int) -> Int {
   var res = a
   for _ in 1..<b {
      res = res * a
   }
   print(res)
   return res
}

pow(firstArg:5, secondArg:3)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

125

Thông số đa dạng

Khi chúng ta muốn xác định hàm với nhiều đối số, thì chúng ta có thể khai báo các thành viên là tham số 'variadic'. Các tham số có thể được chỉ định dưới dạng đa dạng bằng (···) sau tên tham số.

func vari<N>(members: N...){
   for i in members {
      print(i)
   }
}

vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Swift 4", "Enumerations", "Closures")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

4
3
5
4.5
3.1
5.6
Swift 4
Enumerations
Closures

Các tham số không đổi, biến và I / O

Các hàm theo mặc định coi các tham số là 'hằng số', trong khi người dùng cũng có thể khai báo các đối số cho các hàm dưới dạng các biến. Chúng ta đã thảo luận rằng từ khóa 'let' được sử dụng để khai báo các tham số không đổi và các tham số biến được định nghĩa bằng từ khóa 'var'.

Các tham số I / O trong Swift 4 cung cấp chức năng giữ lại các giá trị tham số mặc dù các giá trị của nó được sửa đổi sau khi gọi hàm. Ở phần đầu của định nghĩa tham số hàm, từ khóa 'inout' được khai báo để giữ lại các giá trị thành viên.

Nó dẫn xuất từ ​​khóa 'inout' vì các giá trị của nó được truyền 'vào' cho hàm và các giá trị của nó được truy cập và sửa đổi bởi thân hàm của nó và nó được trả về 'out' khỏi hàm để sửa đổi đối số ban đầu.

Các biến chỉ được chuyển làm đối số cho tham số in-out vì chỉ các giá trị của nó được sửa đổi bên trong và bên ngoài hàm. Do đó không cần khai báo chuỗi và ký tự là tham số đầu vào. '&' trước tên biến cho biết chúng ta đang chuyển đối số tới tham số in-out.

func temp(a1: inout Int, b1: inout Int) {
   let t = a1
   a1 = b1
   b1 = t
}

var no = 2
var co = 10
temp(a1: &no, b1: &co)
print("Swapped values are \(no), \(co)")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Swapped values are 10, 2

Các loại chức năng và cách sử dụng nó

Mỗi và mọi chức năng tuân theo chức năng cụ thể bằng cách xem xét các tham số đầu vào và đưa ra kết quả mong muốn.

func inputs(no1: Int, no2: Int) -> Int {
   return no1/no2
}

Sau đây là một ví dụ -

func inputs(no1: Int, no2: Int) -> Int {
   return no1/no2
}

print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

2
6

Ở đây hàm được khởi tạo với hai đối số no1no2 dưới dạng các kiểu dữ liệu số nguyên và kiểu trả về của nó cũng được khai báo là 'int'

Func inputstr(name: String) -> String {
   return name
}

Ở đây hàm được khai báo là string loại dữ liệu.

Các chức năng cũng có thể có void kiểu dữ liệu và các hàm như vậy sẽ không trả về bất cứ thứ gì.

func inputstr() {
   print("Swift 4 Functions")
   print("Types and its Usage")
}
inputstr()

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Swift 4 Functions
Types and its Usage

Hàm trên được khai báo là một hàm void không có đối số và không có giá trị trả về.

Sử dụng các loại chức năng

Đầu tiên các hàm được truyền với các đối số kiểu số nguyên, float hoặc chuỗi và sau đó nó được truyền dưới dạng hằng số hoặc biến cho hàm như được đề cập bên dưới.

var addition: (Int, Int) -> Int = sum

Ở đây tổng là một tên hàm có các biến số nguyên 'a' và 'b' mà bây giờ được khai báo là một biến cho phép cộng tên hàm. Sau đó, cả hàm cộng và hàm đều có cùng số đối số được khai báo dưới dạng kiểu dữ liệu số nguyên và cũng trả về giá trị số nguyên dưới dạng tham chiếu.

func sum(a: Int, b: Int) -> Int {
   return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Result: 129

Các loại chức năng như các loại tham số & loại trả về

Chúng ta cũng có thể truyền chính hàm dưới dạng các kiểu tham số cho một hàm khác.

func sum(a: Int, b: Int) -> Int {
   return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")

func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
   print("Result: \(addition(a, b))")
}
another(sum, 10, 20)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Result: 129
Result: 30

Các hàm lồng nhau

Một hàm lồng nhau cung cấp cơ sở để gọi hàm bên ngoài bằng cách gọi hàm bên trong.

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement = 0
   func decrementer() -> Int {
      overallDecrement -= total
      return overallDecrement
   }
   return decrementer
}

let decrem = calcDecrement(forDecrement: 30)
print(decrem())

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

-30