Phantom Type - kiểu "bóng ma"
TIL
491
swift
45
White

Vu Nhat Minh viết ngày 18/04/2017

Phantom Type

A phantom type is a parametrised type whose parameters do not all appear on the right-hand side of its definition, e.g

Phantom Type, hay kiểu bóng ma là kiểu được truyền vào định nghĩa những hoàn toàn không được sử dụng. Dưới đây T là Phantom Type

class Data<T> {
    var value: String
    init(v: String) {
        value = v
    }
}

Tại sao lại đẻ ra cái kiểu bóng ma này ? Với kiểu bóng ma, ta có thể biến một biến từ kiểu này sang kiểu khác, miễn là cả 2 kiểu đều mang một bóng ma

func changeType<A, B>(data: Data<A>) -> Data<B> {
  return Data(v: data.value)
}

Tại sao lại cần chuyển "bóng ma" từ đầu thằng này sang đầu thằng khác ?

Có một ví dụ rất hay, là ứng dụng để validate user input. Đầu tiên định nghĩa 2 bóng ma

class Validate{}
class Unvalidate{}

Sau đó là 3 hàm, một hàm nhận giá trị chỉ trả về DataUnvalidate, một hàm biến Unvalidate thành Validate và một hàm sử dụng chỉ dùng được kiểu Validate

func make(input: String) -> Data<Unvalidate> {
    return Data<Unvalidate>(v: input)
}

func validate(data: Data<Unvalidate>) -> Data<Validate> {
    return Data<Validate>(v: data.value)
}

func use(data: Data<Validate>) {
    print("Hello there")
}

Bây giờ là sẽ đến đoạn hay. Khi một input chưa chạy qua hàm validate, thì sẽ chắc chắn không thể use được, compiler sẽ làm nhiệm vụ kiểm tra bóng ma và từ chối biên dịch

let unknown = make(input: "it's me")
use(data: unknown) 
// cannot convert value of type 'Data<Unvalidate>' to expected argument type 'Data<Validate>'

Điều này bắt buộc ta phải chạy qua hàm validate()

let confirmed = validate(data: unknown)
use(data: confirmed)
// Hello there

Bóng ma còn có một ưu điểm nữa, là ta có thể viết hàm chạy trên mọi Data, nhưng không thể biến Unvalidate thành Validate

func toUpperCase<M>(data: Data<M>)-> Data<M> {
  return Data(v: data.value.uppercased())
}

hay là, không thể validate 2 lần !

let try = validate(data: confirmed)
// cannot convert value of type 'Data<Validate>' to expected argument type 'Data<Unvalidate>'

Cool :trollface:

VuNhatMinh 05-08-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Vu Nhat Minh

54 bài viết.
721 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
116 29
Nếu bạn thường vào trang mua sắm của amazon, chắc sẽ chẳng lạ gì với menu Shop by Department. Tốc độ hiển thị nội dung của menu là tức thì so với d...
Vu Nhat Minh viết hơn 2 năm trước
116 29
White
87 4
Lời người dịch Người dịch là một developer , sau khi tìm đọc được bài viết này bằng bản gốc tiếng Anh đã cảm thấy như được "khai sáng" về khả năng...
Vu Nhat Minh viết hơn 2 năm trước
87 4
White
56 5
Đây là phần cuối của một series chuyên về thiết kế UI. Bạn nên đọc (Link) trước khi bắt đầu đọc phần này. Luật số 7: "Ăn trộm" như là một nghệ sỹ...
Vu Nhat Minh viết hơn 2 năm trước
56 5
Bài viết liên quan
White
18 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết hơn 1 năm trước
18 1
White
1 1
Chào mọi người, hôm nay mình viết một bài TIL nhỏ về cách lấy độ phân giải của màn hình hiện tại đang sử dụng. xdpyinfo | grep dimensions Kết quả...
namtx viết 7 tháng trước
1 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
54 bài viết.
721 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!