Tham số ‘inout’ nên sử dụng trong trường hợp nào?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
71 lượt xem
Swift middle

Các tham số hàm theo mặc định là hằng số. 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.

inout có nghĩa là việc sửa đổi biến cục bộ cũng sẽ sửa đổi các tham số được truyền vào. Nếu không có nó, các tham số được truyền vào sẽ vẫn giữ nguyên giá trị. Cố gắng nghĩ về kiểu tham chiếu khi bạn đang sử dụng inout và kiểu giá trị để không sử dụng nó.

  1. Một trường hợp sử dụng tốt sẽ là hàm swap mà nó sẽ sửa đổi các tham số được truyền vào.
  2. Cân nhắc về loại bỏ chi phí copying. Nếu bạn có một hàm sử dụng kiểu giá trị lớn trong bộ nhớ làm đối số (giả sử là kiểu cấu trúc lớn) và trả về cùng kiểu, và cuối cùng hàm trả về trong đó luôn được sử dụng chỉ để thay thế đối số caller, thì inout là ưu tiên như tham số hàm được kết hợp.
struct MyStruct {
   private var myInt: Int = 1

   // ... lots and lots of stored properties

   mutating func increaseMyInt() {
      myInt += 1
   }
} 

/* call to function _copies_ argument to function property 'myHugeStruct' (copy 1)
   function property is mutated
   function returns a copy of mutated property to caller (copy 2) */
func myFunc(var myHugeStruct: MyStruct) -> MyStruct {
   myHugeStruct.increaseMyInt()
   return myHugeStruct
} 

/* call-by-reference, no value copy overhead due to inout opimization */
func myFuncWithLessCopyOverhead(inout myHugeStruct: MyStruct) {
   myHugeStruct.increaseMyInt()
} 

var a = MyStruct()
a = myFunc(a) // copy, copy: overhead
myFuncWithLessCopyOverhead(&a) // call by reference: no memory reallocation
{{login.error}}