https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
Tham số In-Out
Tham số hàm là hằng số theo mặc định. Việc cố gắng thay đổi giá trị của một tham số hàm từ bên trong phần thân của hàm đó dẫn đến lỗi thời gian biên dịch. Điều này có nghĩa là bạn không thể thay đổi giá trị của một tham số do nhầm lẫn. Nếu bạn muốn một hàm sửa đổi giá trị của một tham số và bạn muốn những thay đổi đó vẫn tồn tại sau khi cuộc gọi hàm kết thúc, hãy xác định tham số đó là một tham số in-out.
Bạn viết một tham số in-out bằng cách đặt từ khóa inout ngay trước loại tham số. Tham số in-out có giá trị được truyền vào hàm, được hàm sửa đổi và được chuyển ngược lại khỏi hàm để thay thế giá trị ban đầu. Để có một cuộc thảo luận chi tiết về hoạt động của các tham số in-out và tối ưu hóa trình biên dịch liên quan, hãy xem In-Out Parameters.
Bạn chỉ có thể chuyển một biến làm đối số cho một tham số in-out. Bạn không thể chuyển một hằng số hoặc một giá trị chữ làm đối số, vì không thể sửa đổi các hằng số và chữ. Bạn đặt dấu và (&) ngay trước tên của một biến khi bạn chuyển nó làm đối số cho một tham số vào ra, để cho biết rằng hàm có thể sửa đổi nó.
GHI CHÚ
Các thông số đầu vào không được có giá trị mặc định và không thể đánh dấu các thông số đa dạng là không tham gia.
Đây là một ví dụ về một hàm được gọi là swapTwoInts ( : :), có hai tham số số nguyên đầu vào được gọi là a và b:
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
Hàm swapTwoInts ( : :) chỉ đơn giản là hoán đổi giá trị của b thành a và giá trị của a thành b. Hàm thực hiện hoán đổi này bằng cách lưu trữ giá trị của a trong một hằng số tạm thời được gọi là tạm thờiA, gán giá trị của b cho a, sau đó gán tạm thờiA cho b.
Bạn có thể gọi hàm swapTwoInts ( : :) với hai biến kiểu Int để hoán đổi giá trị của chúng. Lưu ý rằng tên của someInt và anotherInt được bắt đầu bằng dấu và khi chúng được chuyển đến hàm swapTwoInts ( : :):
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
Ví dụ trên cho thấy rằng các giá trị ban đầu của someInt và anotherInt được sửa đổi bởi hàm swapTwoInts ( : :), mặc dù ban đầu chúng được định nghĩa bên ngoài hàm.
GHI CHÚ
Tham số vào không giống như trả về giá trị từ một hàm. Ví dụ swapTwoInts ở trên không xác định kiểu trả về hoặc trả về một giá trị, nhưng nó vẫn sửa đổi giá trị của someInt và anotherInt. Tham số in-out là một cách thay thế để một hàm có tác động bên ngoài phạm vi của thân hàm của nó.
public func getQuestionList(inout language: String) -> NSArray