Các loại thứ trong Swift
Quy tắc là:
Các cá thể lớp là các kiểu tham chiếu (nghĩa là tham chiếu của bạn đến một cá thể lớp thực sự là một con trỏ )
Các hàm là các loại tham chiếu
Mọi thứ khác là một kiểu giá trị ; "mọi thứ khác" chỉ đơn giản có nghĩa là các bản sao của cấu trúc và bản sao của enum, vì đó là tất cả những gì có trong Swift. Ví dụ, mảng và chuỗi là các thể hiện cấu trúc. Bạn có thể chuyển một tham chiếu đến một trong những thứ đó (như một đối số của hàm) bằng cách sử dụng inout
và lấy địa chỉ, như newacct đã chỉ ra. Nhưng bản thân kiểu là một kiểu giá trị.
Loại tham chiếu nào có ý nghĩa đối với bạn
Một đối tượng kiểu tham chiếu là đặc biệt trong thực tế vì:
Chỉ gán hoặc chuyển tới hàm có thể mang lại nhiều tham chiếu đến cùng một đối tượng
Bản thân đối tượng có thể thay đổi ngay cả khi tham chiếu đến nó là một hằng số ( let
, rõ ràng hoặc ngụ ý).
Một đột biến đối với đối tượng ảnh hưởng đến đối tượng đó như được thấy bởi tất cả các tham chiếu đến nó.
Đó có thể là những nguy hiểm, vì vậy hãy chú ý theo dõi. Mặt khác, việc truyền một kiểu tham chiếu rõ ràng là hiệu quả bởi vì chỉ một con trỏ được sao chép và truyền, điều này rất nhỏ.
Loại giá trị nào có ý nghĩa đối với bạn
Rõ ràng, việc chuyển một kiểu giá trị là "an toàn hơn" và let
có nghĩa là nó nói: bạn không thể thay đổi một cá thể struct hoặc cá thể enum thông qua một let
tham chiếu. Mặt khác, sự an toàn đó đạt được bằng cách tạo một bản sao riêng biệt của giá trị, phải không? Điều đó không làm cho việc chuyển một loại giá trị có khả năng tốn kém?
Vâng, có và không. Nó không tệ như bạn nghĩ. Như Nate Cook đã nói, việc chuyển một loại giá trị không nhất thiết ngụ ý sao chép, bởi vì let
(rõ ràng hoặc ngụ ý) đảm bảo tính bất biến nên không cần phải sao chép bất cứ thứ gì. Và ngay cả việc chuyển vào một var
tham chiếu không có nghĩa là mọi thứ sẽ được sao chép, chỉ là chúng có thể được nếu cần thiết (vì có sự đột biến). Các tài liệu đặc biệt khuyên bạn không nên để quần lót bị xoắn.