Tìm hiểu về MetaType trong Swift

Tram Ho

MetaType

Trong Swift, nếu Type được dịch theo nghĩa đen là kiểu của một biến, thì MetaType là kiểu của kiểu biến. Ví dụ, số 5 có kiểu là Int, hay một biến Int có thể nhận giá trị là 5. Tuy nhiên, để viết một phương thức trả về dung lượng bộ nhớ mà một kiểu biến chiếm dụng, chúng ta không thể truyền vào giá trị của biến mà cần truyền kiểu của kiểu biến: MetaType.

.Type.self

Trong ngôn ngữ Swift, MetaType được biểu thị qua thuộc tính .Type. Mỗi biến đều có thể mang giá trị: nếu như biến kiểu Int có thể mang giá trị 5, thì giá trị mà biến kiểu của kiểu Int có thể mang giá trị được biểu thị qua thuộc tính .self. Ví dụ, Int.Type là kiểu của kiểu Int, mang giá trị Int.self.

AnyClass

Thuộc tính và phương thức static có thể được truy cập và sử dụng sau khi đã lấy được MetaType. Trên thực tế, chúng ta thường xuyên sử dụng MetaType, ví dụ một phương thức rất phổ biến của UITableView:

Ở đây, AnyClass thực ra là một MetaType:

Khi chúng ta truy cập đến thuộc tính static, thật ra là chúng ta đã truy cập thông qua MetaType, tuy nhiên XCode đã khéo léo giấu chúng đi bằng cách lược bỏ .self. Hai cách viết sau là tương đương:

type(of:).self

Chúng ta đều có thể dùng type(of:).self để lấy giá trị cho MetaType:

Điểm khác biệt là hàm type(of:) được gọi trên biến, còn .self được gọi trên kiểu của biến.

Protocol

Protocol không phải là một kiểu trong Swift, vì thế không thể trực tiếp truy cập giá trị cho kiểu của Protocol thông qua .self mà phải thông qua class hay struct tương thích với Protocol đó:

Vậy thì .self trên Protocol có ý nghĩa gì? Đó chính là giá trị của kiểu Protocol của Protocol:

Ví dụ

Giả sử chúng ta có 2 class khác nhau cùng tương thích một protocol. Chúng ta cần viết hàm khởi tạo object dựa trên kiểu của class.

Hàm khởi tạo có thể viết theo cách truyền trực tiếp MetaType:

Hoặc có thể viết theo cách sử dụng generics:

Thư viện Reusable sử dụng cách tương tự cho phương thức dequeueReusableCell:

Tài liệu tham khảo

http://www.programmersought.com/article/6707648244/

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo