Computer >> Máy Tính >  >> Điện thoại thông minh >> iPhone

Hãy cùng phân tích sự khác biệt giữa Generics và Any type trong Swift

Swift là một trong những ngôn ngữ an toàn về kiểu chữ hàng đầu hiện nay. ???

Ồ, chờ đã !! Điều đó có nghĩa là gì nếu một ngôn ngữ là loại an toàn? ?

Ngôn ngữ an toàn kiểu luôn đảm bảo rằng một thao tác hoạt động với đúng loại dữ liệu có sẵn tại thời điểm đó. ✓

Nếu một ngôn ngữ có khả năng khai báo các kiểu dữ liệu khác nhau (ví dụ:Int, Float, String, Array, Dictionary) và nó cũng có khả năng đảm bảo rằng một biến được khai báo với một kiểu dữ liệu cụ thể sẽ không bao giờ chứa một kiểu khác dữ liệu, thì nó được gọi là ngôn ngữ an toàn kiểu.

Trong các ngôn ngữ an toàn về kiểu chữ, việc kiểm tra kiểu luôn được thực hiện. Nó có thể xảy ra trong thời gian biên dịch hoặc thời gian chạy tùy thuộc vào ngôn ngữ.✅

Bây giờ, Generics trong Swift là gì ??

Generics là loại an toàn và giúp chúng tôi viết các chức năng và loại linh hoạt, có thể tái sử dụng. Sử dụng Generics, chúng ta có thể viết mã hoạt động cho tất cả các kiểu dữ liệu. Vì Swift là một ngôn ngữ an toàn về kiểu chữ, nên không vi phạm điều này, chúng tôi có thể viết các mã chung để tránh trùng lặp mã.

Hãy lấy một ví dụ đơn giản:Mảng là một tập hợp có thứ tự có thể chứa cùng một loại dữ liệu. Đó là lý do tại sao trong định nghĩa về Mảng, chúng ta có thể thấy rằng Mảng có một loại chung chung là Phần tử . Do đó, Mảng trở thành loại Bộ sưu tập chung .

Được. Mát mẻ. Vậy thì kiểu Any trong Swift là gì? ???

Swift cũng hỗ trợ loại Any. Như tên đã chỉ ra, nó có thể đại diện cho một thể hiện của bất kỳ kiểu nào như kiểu struct, class, enum và function.

Vậy id Objective C và Swift's Any có giống nhau không? ?

Trong Swift 3, Mục tiêu C id gõ bản đồ vào Swift’s Any type. Điều này cải thiện khả năng tương thích của Swift và Objective C.

Nhưng bằng cách nào và tại sao ??

Trong Swift 2, Mục tiêu C id đã được ánh xạ tới đối tượng Bất kỳ của Swift. Điều này hoạt động tốt trong hầu hết các trường hợp, nhưng đôi khi nó dẫn đến hành vi không mong muốn. Một trong những khái niệm chính trong Swift là Loại giá trị và việc ánh xạ này không thực hiện đúng với khái niệm này.

Swift chỉ là một ngôn ngữ mới để phát triển iOS và Objective C đã tồn tại trong nhiều năm. Vì vậy, tất nhiên hầu hết các dự án chỉ được phát triển trong Mục tiêu C. Bây giờ để chuyển đổi một dự án Objective thành một dự án Swift, yêu cầu đặt ra là có thể kết nối bất kỳ kiểu Swift nào với bất kỳ đối tượng Objective C. nào.

Nhưng đây không phải là vấn đề đối với các lớp Swift và các kiểu giá trị Swift như Int, String, Float vì chúng đã có các đối tác Objective C của chúng. Vấn đề đã phát sinh đối với các loại giá trị Swift không có bất kỳ đối tác Objective C. nào.

Vì vậy, để khắc phục điều này, loại id Objective C được ánh xạ vào Swift Any type.✅✅✅

Định nghĩa đủ chưa?. Bây giờ chúng ta hãy đến với chủ đề chính. Bởi những điểm trên, có vẻ như Generics và Any type đều giống nhau. Nhưng chúng có thực sự không ???

Ở cấp độ cao, Bất kỳ có thể trông giống với Thuốc gốc. Nhưng chúng ta hãy thử tìm một số điểm khác biệt - ???

Tất cả chúng ta đều biết thế nào là Ngăn xếp nằm trong Cấu trúc dữ liệu, phải không? Ngăn xếp là cấu trúc dữ liệu tuyến tính cơ bản trong đó việc chèn và xóa các mục chỉ diễn ra ở một đầu.

Bây giờ chúng ta sẽ triển khai cấu trúc Ngăn xếp trong Swift. Đầu tiên, chúng tôi sẽ triển khai bằng cách sử dụng Generics sau đó với loại Any.

Triển khai ngăn xếp bằng Generics:

Việc triển khai Stack ở trên đang sử dụng Generics. Cấu trúc có một loại chung là Phần tử vật phẩm và thực hiện một ngăn xếp bằng cách sử dụng vật phẩm đó. Bây giờ chúng ta hãy thực hiện một số thao tác với Generic Stack:

Nó khai báo một Ngăn xếp Chung có thể chứa một loại phần tử Số nguyên. Chúng tôi đang đẩy phần tử số nguyên vào ngăn xếp. Cho đến thời điểm này, mọi thứ đều hoạt động tốt.

Nhưng điều gì sẽ xảy ra nếu tôi muốn đẩy một phần tử float lên phần tử đó phía trên genericStack?

Hãy cùng phân tích sự khác biệt giữa Generics và Any type trong Swift

❌❌ Rất tiếc! Dịch lỗi! ❌❌

Triển khai Ngăn xếp bằng Bất kỳ loại nào:

Trong Triển khai ngăn xếp này, mảng mục có thể chứa Bất kỳ loại phần tử nào. Chúng tôi không chỉ định loại dữ liệu chính xác của mục phần tử mảng trong định nghĩa. Bây giờ chúng ta hãy thực hiện các thao tác cơ bản tương tự trên ngăn xếp này:

Không có vấn đề gì, phải không? Mọi thứ cũng đang hoạt động tốt ở đây. Ban đầu, chúng tôi khai báo một ngăn xếp và đẩy hai phần tử nguyên vào đó. Khi chúng tôi gọi là show () , nó in ra mảng chính xác [3, 4].

Bây giờ chúng ta hãy đẩy một giá trị float vào đó.☄️

Hãy cùng phân tích sự khác biệt giữa Generics và Any type trong Swift

✅✅ Không có lỗi! Mọi thứ đều hoạt động tốt! ✅✅

Vậy điều gì đang xảy ra đằng sau hậu trường ? Tại sao chúng tôi không nhận được bất kỳ lỗi nào ??? ?

Generics về cơ bản cho trình biên dịch biết rằng:

Tôi đã khai báo một kiểu chung và tôi sẽ cung cấp cho bạn một kiểu chính xác sau. Tôi muốn bạn áp dụng loại đó ở mọi nơi tôi chỉ định.

Loại Bất kỳ về cơ bản cho trình biên dịch biết:

Đừng lo lắng về biến này, không cần áp dụng bất kỳ loại nào ở đây, hãy để tôi làm bất cứ điều gì tôi muốn.

Generics có thể được sử dụng để xác định các hàm linh hoạt, nhưng các loại đối số vẫn được trình biên dịch kiểm tra. Bất kỳ loại nào cũng có thể được sử dụng để né tránh hệ thống loại của Swift.?

Trong khai báo ngăn xếp chung , chúng tôi đang nói với trình biên dịch rằng ngăn xếp chỉ nên lấy kiểu số nguyên. Sau đó, khi chúng ta cố gắng chèn một loại phần tử float vào nó, điều đó có nghĩa là chúng ta đang phá vỡ lời hứa đó. Do đó, nó đang tạo ra một lỗi thời gian biên dịch. Nó luôn mong đợi rằng phần tử phải là một kiểu số nguyên.

Nhưng đối với bất kỳ ngăn xếp nào , chúng tôi không nhận được bất kỳ lỗi thời gian biên dịch hoặc thời gian chạy nào. Ngay cả khi chúng tôi gọi là show () , nó in ngăn xếp dưới dạng [3, 4, 5.0] có nghĩa là ngăn xếp chứa các giá trị kiểu số nguyên và kiểu float. Vì vậy, trong bất kỳ ngăn xếp nào, không có giới hạn về kiểu, chúng tôi có thể đẩy bất kỳ loại giá trị nào vào đó (nhưng có khả năng xảy ra ngoại lệ thời gian chạy).

Kết luận

Vì vậy, nếu chúng tôi sử dụng Generics thì chúng tôi có thể viết các hàm, cấu trúc, lớp và giao thức linh hoạt mà không ảnh hưởng đến sự an toàn kiểu của Swift. Nhưng nếu chúng ta sử dụng Loại bất kỳ, thì chúng ta là ông chủ của chính mình, chúng ta có thể làm hầu hết mọi thứ chúng ta muốn.

Đ ??? Chúc mừng !!! Cảm ơn bạn đã đọc!! ???