2014-09-23 15 views
18

Tôi bắt đầu học ngôn ngữ Swift và đang gặp khó khăn khi gói đầu của tôi xung quanh các giao thức, cấu trúc và lớp học.Swift: Nghị định thư so với cấu trúc so với lớp

Tôi đến từ phía Android của lập trình, vì vậy tôi tin rằng giao thức Swift về cơ bản là giao diện Java?

Trường hợp sử dụng phù hợp cho từng trường hợp này là gì?

Trả lời

36

Những điểm tương đồng không phải là "chính xác" đúng, nhưng đây là ý chính của nó như tôi hiểu nó

  1. Vâng, giao thức là một cách hiệu quả như giao diện

  2. Lớp học các lớp học, giống như trong Java/Android, và khá nhiều ngôn ngữ khác

  3. Structs giống như các lớp, nhưng chúng được chuyển qua giá trị (được sao chép) khi truyền chúng từ một biến này sang hàm khác. Nếu bạn đã quen thuộc với C#, nó thực hiện các cấu trúc rất giống nhau.

Ví dụ:

class Foo { 
    ... 
} 

let x = Foo() 
let z = x 

Tại thời điểm này x và z cả tham khảo các đối tượng tương tự trong bộ nhớ, chỉ có một Foo đối tượng

struct Bar { 
    ... 
} 

let a = Bar() 
let b = a 

Khi gán b, a là sao chép (nghĩ về cơ bản sao chép khối bộ nhớ). Tại thời điểm này, có hai đối tượng độc lập Bar trong bộ nhớ và sửa đổi một đối tượng không ảnh hưởng đến đối tượng kia.

Tại sao điều này hữu ích? Đôi khi bạn không muốn tham chiếu được chia sẻ, nhưng chủ yếu là vì lý do hiệu suất. Bởi vì các cấu trúc không phải tất cả tham chiếu đến cùng một đối tượng, chúng không cần phải được cấp phát trên heap. Thay vào đó, chúng có thể được phân bổ trên ngăn xếp, nhanh hơn nhiều hơn. Ngoài ra mảng của cấu trúc có thể được thực hiện như một khối tiếp giáp lớn của bộ nhớ có nghĩa là nó thân thiện hơn nhiều trên bộ nhớ cache CPU nếu bạn muốn lặp qua tất cả.

Swift không phải là rác được thu thập, nhưng đối với các ngôn ngữ thu thập rác như C# điều này có nghĩa là người thu gom rác không phải đối phó với nhiều đối tượng mà nó có thể phải làm. Ngay cả trong nhanh chóng việc sao chép cấu trúc có nghĩa là nó có thể tránh làm việc Retain/Release đằng sau hậu trường cần thiết cho ARC, có thể giúp ích rất nhiều.

Trường hợp sử dụng chính cho cấu trúc là khi bạn có nhiều "dữ liệu đơn giản" bất biến như Vector (bộ 3 giá trị dấu phẩy động)

+0

Giải thích rất tốt. Điều đó trả lời câu hỏi của tôi, cảm ơn! –

+0

Lưu ý rằng Mảng, Chuỗi và Từ điển là tất cả các cấu trúc trong Swift. Thư viện chuẩn nói chung dựa nhiều vào các cấu trúc và giao thức hơn là các lớp. –

+0

"let a = Bar() cho b = a. Khi gán b, a được sao chép (nghĩ về cơ bản sao chép khối bộ nhớ). Tại thời điểm này, có hai đối tượng Bar độc lập trong bộ nhớ và sửa đổi một đối tượng không ảnh hưởng đến khác. " Không đúng khi triển khai. Nhưng trong sử dụng có hiệu quả đúng sự thật. Khi phân công xảy ra cho một cấu trúc, một tham chiếu được thực hiện cho bản gốc. Bạn chỉ nhận được một bản sao khi bạn thực sự thay đổi b. Điều này được gọi là bản sao trên ghi. Nó tiết kiệm bộ nhớ cho đến khi nó thực sự cần thiết trong thời gian chạy. – kent

Các vấn đề liên quan