2015-03-25 29 views
13

Trong chuỗi Objc, mảng và từ điển là tất cả các loại tham chiếu, trong khi trong Swift chúng là tất cả các loại giá trị.tại sao chuỗi, mảng và từ điển trong Swift thay đổi thành loại giá trị

  1. Tôi muốn tìm hiểu lý do đằng sau hậu trường là gì, cho dù đó là loại tham chiếu hay loại giá trị, các đối tượng sống trong heap trong cả Objc và Swift.

  2. Thay đổi để tạo mã dễ dàng hơn? tức là nếu nó là kiểu tham chiếu thì con trỏ tới đối tượng có thể không phải là nil, vì vậy cần kiểm tra cả con trỏ và đối tượng không phải để truy cập đối tượng. Mặc dù nếu đó là loại giá trị thì chỉ cần kiểm tra đối tượng đó?

  3. Nhưng về phân bổ bộ nhớ, loại giá trị và loại tham chiếu giống nhau, phải không? cả hai đều có cùng kích thước bộ nhớ?

nhờ

Trả lời

15

Mảng, từ điển, vv trong Mục tiêu-C thường có thể thay đổi. Điều đó có nghĩa là khi tôi chuyển một mảng tới một phương thức khác, và sau đó mảng đó được sửa đổi sau mặt sau của phương thức khác, hành vi đáng ngạc nhiên (để đặt nó nhẹ nhàng) sẽ xảy ra.

Bằng cách tạo mảng, từ điển, vv các loại giá trị, hành vi đáng ngạc nhiên này sẽ tránh được. Khi bạn nhận được một mảng Swift, bạn biết rằng không ai sẽ sửa đổi nó sau lưng bạn. Các đối tượng có thể được sửa đổi sau lưng của bạn là một nguồn chính cho các vấn đề.

Trong thực tế, trình biên dịch Swift cố gắng tránh sao chép không cần thiết bất cứ khi nào có thể. Vì vậy, ngay cả khi nó nói rằng một mảng được chính thức sao chép, nó không có nghĩa là nó là thực sự sao chép.

+2

Tôi chưa bao giờ bị mắc kẹt trong đó nguồn chính của vấn đề. Tuy nhiên, bản sao của mảng đó sâu bao nhiêu? Và tại sao nó là "nguồn chính của vấn đề", khi mảng thay đổi, nhưng không có "nguồn chính của vấn đề", khi một mục trong mảng đó thay đổi một trong các thuộc tính của nó? Và tại sao họ nghĩ tại nhóm Swift rằng sự thay đổi của một mục không phải là "nguồn chính của vấn đề" trong khi thay đổi độ dài của mảng là "nguồn chính của vấn đề" trong một thời gian dài và tại sao họ lại thay đổi ý kiến ​​của họ? –

+0

Tôi đồng ý với bạn chủ yếu, nhưng tôi đoán, trong Obj-C đó là trách nhiệm của nhà phát triển không phải để vượt qua/yêu cầu đối tượng có thể thay đổi miễn là không có lựa chọn nào khác. các đối tượng không thể thay đổi không thể được sửa đổi sau lưng của người gọi, do đó, từ góc độ này, logic của bạn trông giống như một sự phá vỡ đối với tôi. – holex

+0

Điểm logic của tôi đơn giản là "sửa đổi sau lưng tôi" không gây ra các vấn đề nghiêm trọng trong thực tế. Đây là một trong những tính năng "chúng tôi giải quyết vấn đề chỉ tồn tại về mặt lý thuyết" của Swift. Bạn có vấn đề đó trong mã sản xuất chỉ một lần? Vì vậy, ngay từ đầu đã có một giải pháp nhanh chóng và bẩn (không nhất quán) cho một vấn đề không có và bây giờ chúng tôi có một giải pháp nhất quán cho một vấn đề không làm cho đôi khi khó khăn hơn và sẽ có một bản in hiệu suất. –

-4

Tôi không biết, cho dù đây là ý tưởng thực sự đằng sau nó, nhưng có một cái nhìn lịch sử về nó:

Lúc đầu, một bản sao mảng cư xử bằng cách tham khảo, khi bạn đã thay đổi một mục trong đó. Nó hoạt động theo giá trị, khi bạn thay đổi độ dài của mảng. Họ đã làm nó vì lý do hiệu suất (ít bản sao mảng). Nhưng tất nhiên, eh, làm thế nào tôi có thể diễn tả một cách lịch sự, eh, khó với Swift, eh, hãy gọi nó là "không quan tâm đến một cấu trúc tốt nếu bạn có thể giành được một số hiệu suất, bạn có lẽ không bao giờ cần" cách tiếp cận . Một số được gọi là copy-on-write, những gì không thông minh hơn nhiều, bởi vì COW là minh bạch, trong khi hành vi đó không minh bạch. Từ điển Swift điển hình: Sử dụng một từ thông dụng, sử dụng nó theo cách, nó phù hợp với Swift, không quan tâm đến tính chính xác.

Sau đó trên các mảng hoàn chỉnh bằng hành vi sao chép, điều ít gây nhầm lẫn hơn. Rõ ràng trong khái niệm của Swift, khả năng đọc có nghĩa là "ít ký tự hơn", nhưng không có nghĩa là "dễ hiểu hơn". Từ điển Swift điển hình: Sử dụng một từ thông dụng, sử dụng nó theo cách, nó phù hợp với Swift, Tôi đã đề cập đến điều đó chưa?)

Vì vậy, tôi đoán nó vẫn là hiệu suất cộng với hành vi dễ hiểu có thể dẫn đến hiệu suất kém hơn. (Bạn sẽ biết rõ hơn khi một bản sao là cần thiết trong mã của bạn và bạn vẫn có thể làm điều đó và bạn nhận được một hoạt động 0 từ Cocoa, nếu mảng nguồn là không thay đổi.) Tất nhiên, họ có thể nói: "Được rồi, bởi giá trị là một sai lầm, chúng tôi đã thay đổi điều đó. " Nhưng họ sẽ không bao giờ nói.

Tuy nhiên, hiện tại các mảng trong Swift hoạt động nhất quán. Một tiến bộ lớn trong Swift! Có lẽ bạn có thể gọi nó là ngôn ngữ lập trình vào một ngày nắng.

+4

Điều đó không trả lời bất kỳ câu hỏi nào được hỏi. Đó chỉ là ý kiến ​​của bạn về Swift nói chung. – HAS

+0

@HAS Đó là sai. –

6

Nhóm Swift rất tích cực trên diễn đàn nhà phát triển chính thức. Vì vậy, tôi giả định rằng vì bạn không hỏi ở đó, bạn tò mò hơn về ý nghĩa rộng lớn hơn của cộng đồng về ý nghĩa của thay đổi, trái ngược với các chi tiết triển khai kỹ thuật. Nếu bạn muốn hiểu chính xác "tại sao", chỉ cần đi hỏi họ :)

Giải thích có ý nghĩa nhất với tôi là các đối tượng phải chịu trách nhiệm phản ứng và cập nhật trạng thái đơn đăng ký của bạn. Giá trị phải là trạng thái của ứng dụng của bạn. Nói cách khác, một Array hoặc một String hoặc một Dictionary (và các kiểu giá trị khác) không bao giờ chịu trách nhiệm trả lời đầu vào của người dùng hoặc đầu vào mạng hoặc các điều kiện lỗi, vv Các đối tượng xử lý và lưu trữ dữ liệu kết quả vào các giá trị đó.

Một tính năng thú vị trong Swift, làm cho một loại giá trị phức tạp (như từ điển hoặc kiểu tùy chỉnh như Person, trái ngược với Float đơn giản hơn) là loại giá trị có thể đóng gói các quy tắc và logic bởi vì chúng có thể có chức năng. Nếu tôi viết một loại giá trị Person làm cấu trúc, thì cấu trúc Person có thể có chức năng cập nhật tên do kết hôn, v.v. Đó chỉ là quan tâm đến dữ liệu chứ không phải với/quản lý/trạng thái. Các đối tượng vẫn sẽ quyết định WHEN và WHY để cập nhật tên của một Person, nhưng logic nghiệp vụ về cách thực hiện một cách an toàn/test-ably có thể được bao gồm trong Value Type. Do đó cho bạn một cách tốt đẹp để tăng sự cô lập và giảm độ phức tạp.

2

Ngoài các câu trả lời trước đây, cũng có các vấn đề đa luồng để xem xét với việc chia sẻ loại bộ sưu tập dựa trên tham chiếu mà chúng tôi không phải lo lắng nhiều về việc chia sẻ một thể hiện của một loại dựa trên giá trị và có hành vi Sao chép-Viết. Đa lõi ngày càng trở nên ngày càng tăng lên ngay cả trên các thiết bị iOS, do đó, nó đã trở thành một vấn đề cho các nhà phát triển ngôn ngữ Swift để xem xét.

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