Phantom Type - kiểu "bóng ma"
TIL
592
swift
68
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.
775 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
119 30
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 gần 3 năm trước
119 30
White
93 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 3 năm trước
93 4
White
61 7
Form là thành phần quan trọng nhất khi design flow đăng ký của 1 web hay 1 app, dù là view gồm nhiều bước hay chỉ là một màn hình đơn điệu. Bài này...
Vu Nhat Minh viết hơn 1 năm trước
61 7
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 29 ngày trước
0 2
White
11 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết 3 năm trước
11 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
54 bài viết.
775 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á!