Number
là mộttype
quan trọng mà chúng ta gặp rất nhiều trong công việc lập trình hàng ngày. Chúng ta bứt gặpnumber
ở khắp mọi nơi từ tính toán kích thước, bố cục choUI
cho đếnconditional
của cácevent
.Làm việc với
number
là một trong công việc chính mà máy tính được tạo ra nhưng đôi khi để con người có thể giao tiếp được với máy tính thìnumber
phải được chuyển về cácformat
mà con người có thể đọc hiểu để đảm bảo tính chính xác cũng như chặt chẽ theo yêu cầu.
1/ Solving the decimal problem:
- Nếu yêu cầu đơn giản chúng ta có thể sử dụng
string literal
để khởi tạonumber
từ dạngString
như sau:
1 2 3 4 | <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token number">42</span><span class="token punctuation">)</span> <span class="token comment">// "42"</span> <span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span><span class="token number">3.14</span><span class="token punctuation">)</span> <span class="token comment">// "3.14"</span> <span class="token keyword">let</span> c <span class="token operator">=</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span><span class="token number">42</span><span class="token delimiter variable">)</span></span>, <span class="token interpolation"><span class="token delimiter variable">(</span><span class="token number">3.14</span><span class="token delimiter variable">)</span></span>"</span> <span class="token comment">// "42, 3.14"</span> |
Phương pháp hoạt động tốt và dễ tiếp cận và cho phép chúng ta hoàn toàn kiểm soát các giá trị của
number
, nhưng để tăng tính cơ động trong mục đích sử dụng chúng ta có thể cần các phương thức cũng như định dạng khác khi làm việc với các giá trịnumber
thay đổi liên tục.Để lấy ví dụ chúng ta sẽ triển khai
type
Metric
cho phép chúng ta liên kếttype
Double
với cácname
,value
,description
:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">struct</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> value<span class="token punctuation">:</span> <span class="token builtin">Double</span> <span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span>: <span class="token interpolation"><span class="token delimiter variable">(</span>value<span class="token delimiter variable">)</span></span>"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Để cho
number
dạngDouble
có thể dễ đọc hơn ta có thể chuyển nó từDouble
sang dạngString
bằng cách có thể tùy chỉnh vị trí thập phân để có thể đảm bảooutput
ra luôn nhất quán:
1 2 3 4 5 6 7 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formattedValue <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span>format<span class="token punctuation">:</span> <span class="token string">"%.2f"</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span>: <span class="token interpolation"><span class="token delimiter variable">(</span>formattedValue<span class="token delimiter variable">)</span></span>"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Chúng ta gặp vấn đề ở đây khi nếu
number
là dạng số nguyên thìoutput
cũng vẫn sẽ hiển thị dấu thập phân, ví dụ nhưnumber
42
sẽ cho raoutput
là42.00
.Cách giải quyết vấn đề này là chúng ta sẽ lọc và bỏ bớt các
number
sau dấu thập phân nếu chúng là0
như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> formattedValue <span class="token operator">=</span> <span class="token function">String</span><span class="token punctuation">(</span>format<span class="token punctuation">:</span> <span class="token string">"%.2f"</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span> <span class="token keyword">while</span> formattedValue<span class="token punctuation">.</span><span class="token builtin">last</span> <span class="token operator">==</span> <span class="token string">"0"</span> <span class="token punctuation">{</span> formattedValue<span class="token punctuation">.</span><span class="token function">removeLast</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> formattedValue<span class="token punctuation">.</span><span class="token builtin">last</span> <span class="token operator">==</span> <span class="token string">"."</span> <span class="token punctuation">{</span> formattedValue<span class="token punctuation">.</span><span class="token function">removeLast</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span>: <span class="token interpolation"><span class="token delimiter variable">(</span>formattedValue<span class="token delimiter variable">)</span></span>"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Đoạn
code
trên hoạt động có vẻ ổn nhưng chưa gọn gàng lắm và đây không phải là một hướng tiếp cận cho tất cả trường hợp sử dụng, vì trong các ngôn ngữ khác nhau sẽ có các phương thức biểu diễnnumber
khác nhau và chúng ta không thể cứ xử lý các trường hợp cá biệt cho từng ngôn ngữ được.
2/ Using NumberFormatter:
Sử dụng
NumberFormatter
trongFoundation
để giải quyết vấn đề trên củanumber
sau dấu thập phân nhưDateFormatter
định dạng các giá trịDate
là một lựa chọn tốt hơn vìNumberFormatter
đã cung cấp cho chúng ta đầy đủ các công cụ cần thiết để chúng ta làm việc vớinumber
.Với
NumberFormatter
chúng ta có thể làm việc với từngnumber
có thập phân hay không có thập phân và hiển thịnumber
chính xác đến từng số sau dấu thập phân mà chúng ta mong muốn như42
,42.1
,42.22
:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> formatter<span class="token punctuation">.</span>numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span>decimal formatter<span class="token punctuation">.</span>maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token function">NSNumber</span><span class="token punctuation">(</span>value<span class="token punctuation">:</span> value<span class="token punctuation">)</span> <span class="token keyword">let</span> formattedValue <span class="token operator">=</span> formatter<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span>from<span class="token punctuation">:</span> number<span class="token punctuation">)</span><span class="token operator">!</span> <span class="token keyword">return</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span>: <span class="token interpolation"><span class="token delimiter variable">(</span>formattedValue<span class="token delimiter variable">)</span></span>"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Một lợi ích nữa chúng ta nhận được khi sử dụng
NumberFormatter
là nó sẽ tự động sử dụngLocale
mà chúng ta đang sử dụng để định dạng. Ví dụ như ở một số quốc gianumber
69969.69
sẽ được định dạng thành69 969,69
thay vì69,969.69
. Các trường hợp phức tạp trên chúng ta đều có thể xử lý dễ dàng và tự động.Không phải trong tất cả các trường hợp chúng ta đều có thể sử dụng
Locale
, chúng ta cần tùy chỉnh thêmdecimalSeparator
vàgroupingSeparator
nhưu sau:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> formatter<span class="token punctuation">.</span>numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span>decimal formatter<span class="token punctuation">.</span>maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> formatter<span class="token punctuation">.</span>decimalSeparator <span class="token operator">=</span> <span class="token string">"."</span> formatter<span class="token punctuation">.</span>groupingSeparator <span class="token operator">=</span> <span class="token string">""</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Trong trường hợp này chúng ta muốn các định dạng
formatting
của chúng ta phải tuân theo từng khu vực đang sử dụng. Chúng ta cần tạo thêmstatic
property
cho chúng ta có thể sử dụng lại cácMetric
value
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">var</span> valueFormatter<span class="token punctuation">:</span> <span class="token builtin">NumberFormatter</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> formatter<span class="token punctuation">.</span>numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span>decimal formatter<span class="token punctuation">.</span>maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">return</span> formatter <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">var</span> formattedValue<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token function">NSNumber</span><span class="token punctuation">(</span>value<span class="token punctuation">:</span> value<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">Self</span><span class="token punctuation">.</span>valueFormatter<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span>from<span class="token punctuation">:</span> number<span class="token punctuation">)</span><span class="token operator">!</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token string">"<span class="token interpolation"><span class="token delimiter variable">(</span>name<span class="token delimiter variable">)</span></span>: <span class="token interpolation"><span class="token delimiter variable">(</span>formattedValue<span class="token delimiter variable">)</span></span>"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
3/ Domain-specific numbers:
Tùy thuộc vào kiểu
app
mà chúng ta đang làm việc cùng mà chúng ta sẽ có cơ hội đối diện vớidomain-specific
. Trong trường hợp đó chúng ta sẽ cần phải có thêm cácdescription
củanumber
hơn là chỉ vớivalue
của nó:Chúng ta làm việc với
shopping app
và chúng ta sử dụngDouble
để biểu diễnPrice
struct
để mô tả giá sản phẩm:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">struct</span> <span class="token builtin">Product</span><span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price<span class="token punctuation">:</span> <span class="token builtin">Price</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token keyword">struct</span> <span class="token builtin">Price</span><span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> amount<span class="token punctuation">:</span> <span class="token builtin">Double</span> <span class="token keyword">var</span> currency<span class="token punctuation">:</span> <span class="token builtin">Currency</span> <span class="token punctuation">}</span> <span class="token keyword">enum</span> <span class="token builtin">Currency</span><span class="token punctuation">:</span> <span class="token builtin">String</span><span class="token punctuation">,</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> eur <span class="token keyword">case</span> usd <span class="token keyword">case</span> sek <span class="token keyword">case</span> pln <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> |
Câu hỏi được đặt ra ở đây là làm thế nào chúng ta có thể định dạng
instance
Price
cho từnguser
ở từng quốc gia khác nhau vớiLocale
khác nhau:Đây là một trường hợp mà
NumberFormatter
tỏ ra vô cùng hữu dụng bao gồm cả việcfull-support
choLocale
cũng như việc có thể tùy chỉnhnumberStyle
vàcurrency
như sauL
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">extension</span> <span class="token builtin">Price</span><span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> formatter<span class="token punctuation">.</span>numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span>currency formatter<span class="token punctuation">.</span>currencyCode <span class="token operator">=</span> currency<span class="token punctuation">.</span>rawValue formatter<span class="token punctuation">.</span>maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token function">NSNumber</span><span class="token punctuation">(</span>value<span class="token punctuation">:</span> amount<span class="token punctuation">)</span> <span class="token keyword">return</span> formatter<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span>from<span class="token punctuation">:</span> number<span class="token punctuation">)</span><span class="token operator">!</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Kết quả chúng ta nhận được ở đây sẽ là định giá cho từng quốc gia sử dụng
Locale
khác nhau, ví dụ nhưprice
3.14
ở Sweden sử dụng đơn vị tiền tệ làSEK
sẽ được hiển thị như sau- Sweden:
3,14 kr
- Spain:
3.14 SEK
- US:
SEK 3.14
- France:
SEK 3,14
- Sweden:
- Bên cạnh
price
chúng ta thường gặp trường hợp các giá trịnumber
hiển thị theo các thông số đo lường. Ví dụ như chúng ta muốn tập trung vào vận tốc cao nhất đạt được của một chiếc xe nhưtopSpeed
:
1 2 3 4 5 6 7 | <span class="token keyword">struct</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price<span class="token punctuation">:</span> <span class="token builtin">Price</span> <span class="token keyword">var</span> topSpeed<span class="token punctuation">:</span> <span class="token builtin">Double</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- Trong trường hợp này thì để đo lường một cách chính xác
topSpeed
thìDouble
không phải là lựa chọn tối ưu mà thay vào đó chúng ta có thể sử dụng luônMeasurement
với mộtphantom type
làUnitSpeed
:
1 2 3 4 5 6 7 8 | <span class="token keyword">struct</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price<span class="token punctuation">:</span> <span class="token builtin">Price</span> <span class="token keyword">var</span> topSpeed<span class="token punctuation">:</span> <span class="token builtin">Measurement</span><span class="token operator"><</span><span class="token builtin">UnitSpeed</span><span class="token operator">></span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- Trong khi khởi tạo
Vehicle
instance
chúng ta có thể sẽ phải chỉ định rõ đơn vị đo lường chotopSpeed
để tránh sự mơ hồ. DoMeasurement
có sẵnformatter
nên chúng ta có thể dễ dàng xử lý vấn đề này:
1 2 3 4 5 6 7 | <span class="token keyword">extension</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> formattedTopSpeed<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">MeasurementFormatter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> formatter<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span>from<span class="token punctuation">:</span> topSpeed<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Chúng ta cần ghi nhớ rằng khi sử dựng
Measurement
chúng ta sẽ đồng thời sử dụngencoded
vàdecoded
nên chúng ta sẽ cầnCodeable
đểMeasurement
để đảm bảo khi giá trị chúng ta có thể không nằm trongJSON
mà chúng ta có thểdownload
từapp server
. Trường hợp này chúng ta sẽ cần thêm các đơn vị đo lường đã được thống nhất để quá trìnhdecoded
hoạt động tốt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">extension</span> <span class="token builtin">Vehicle</span><span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">enum</span> <span class="token builtin">CodingKeys</span><span class="token punctuation">:</span> <span class="token builtin">CodingKey</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> name<span class="token punctuation">,</span> price<span class="token punctuation">,</span> topSpeed<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token keyword">init</span><span class="token punctuation">(</span>from decoder<span class="token punctuation">:</span> <span class="token builtin">Decoder</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> container <span class="token operator">=</span> <span class="token keyword">try</span> decoder<span class="token punctuation">.</span><span class="token function">container</span><span class="token punctuation">(</span>keyedBy<span class="token punctuation">:</span> <span class="token builtin">CodingKeys</span><span class="token punctuation">.</span><span class="token keyword">self</span><span class="token punctuation">)</span> <span class="token comment">// Decoding all other properties</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> topSpeed <span class="token operator">=</span> <span class="token keyword">try</span> <span class="token function">Measurement</span><span class="token punctuation">(</span> value<span class="token punctuation">:</span> container<span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span><span class="token builtin">Double</span><span class="token punctuation">.</span><span class="token keyword">self</span><span class="token punctuation">,</span> forKey<span class="token punctuation">:</span> <span class="token punctuation">.</span>topSpeed<span class="token punctuation">)</span><span class="token punctuation">,</span> unit<span class="token punctuation">:</span> <span class="token punctuation">.</span>kilometersPerHour <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// Encoding implementation</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- Chúng ta bây giờ có thể sử dụng các
property wrapper
để đóng gói sự chuyển đổi giữaDouble
vàMeasurement
với mộttype
duy nhất:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @propertyWrapper <span class="token keyword">struct</span> <span class="token builtin">KilometersPerHour</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> wrappedValue<span class="token punctuation">:</span> <span class="token builtin">Measurement</span><span class="token operator"><</span><span class="token builtin">UnitSpeed</span><span class="token operator">></span> <span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">KilometersPerHour</span><span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">init</span><span class="token punctuation">(</span>from decoder<span class="token punctuation">:</span> <span class="token builtin">Decoder</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> container <span class="token operator">=</span> <span class="token keyword">try</span> decoder<span class="token punctuation">.</span><span class="token function">singleValueContainer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">let</span> rawValue <span class="token operator">=</span> <span class="token keyword">try</span> container<span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span><span class="token builtin">Double</span><span class="token punctuation">.</span><span class="token keyword">self</span><span class="token punctuation">)</span> wrappedValue <span class="token operator">=</span> <span class="token function">Measurement</span><span class="token punctuation">(</span> value<span class="token punctuation">:</span> rawValue<span class="token punctuation">,</span> unit<span class="token punctuation">:</span> <span class="token punctuation">.</span>kilometersPerHour <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">encode</span><span class="token punctuation">(</span>to encoder<span class="token punctuation">:</span> <span class="token builtin">Encoder</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> container <span class="token operator">=</span> encoder<span class="token punctuation">.</span><span class="token function">singleValueContainer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">try</span> container<span class="token punctuation">.</span><span class="token function">encode</span><span class="token punctuation">(</span>wrappedValue<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Tốn bao công giờ chúng ta thu hoặc lợi ích naofm chúng ra giờ có thể đánh dấu
topSpeed
property
với@KilometersPerHour
:
1 2 3 4 5 6 7 | <span class="token keyword">struct</span> <span class="token builtin">Vehicle</span><span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name<span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price<span class="token punctuation">:</span> <span class="token builtin">Price</span> @<span class="token builtin">KilometersPerHour</span> <span class="token keyword">var</span> topSpeed<span class="token punctuation">:</span> <span class="token builtin">Measurement</span><span class="token operator"><</span><span class="token builtin">UnitSpeed</span><span class="token operator">></span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- Chúng ta giờ đã đảm bảo cho việc sử dụng một cách an toàn và hiệu quả cho
Measurement
từ triển khai trên phục vụ cho việc định dạng và chuyển đổi thích họp cho các tính năng chúng ta cần khi phát triểnapp
khiencoding
vàdecoding
data model
.