Phantom Type - kiểu "bóng ma"
TIL
763
swift
57
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

56 bài viết.
931 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
143 32
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 5 năm trước
143 32
White
113 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 5 năm trước
113 4
White
82 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 3 năm trước
82 7
Bài viết liên quan
White
14 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 hơn 5 năm trước
14 4
White
2 0
Có nhiều cách viết blog công nghệ hơn là làm bánh hay làm tình. Những ngày này Hà Nội mưa liên miên, được cái mát giời, mình lại tức cảnh sinh tìn...
VietHQ viết 3 năm trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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