Measurement
import Foundation // Measurement
/* ------- Custom Extensions ------- */
extension Double {
/// usage: `6.ft`
var ft: Measurement<UnitLength> {
Measurement(value: self, unit: UnitLength.feet)
}
/// usage: `180.deg`
var deg: Measurement<UnitAngle> {
Measurement(value: self, unit: UnitAngle.degrees)
}
/// usage: `4.m²`
var m²: Measurement<UnitArea> {
Measurement(value: self, unit: UnitArea.squareMeters)
}
}
extension Measurement where UnitType: Dimension {
/// usage: `6.ft.in(.centimeters)`
func `in`(_ otherUnit: UnitType) -> Measurement<UnitType> {
converted(to: otherUnit)
}
}
// ----------------------------------------
// length
let h1 = Measurement(value: 6, unit: UnitLength.feet)
let h2 = h1.converted(to: UnitLength.inches)
let h3 = h1.converted(to: UnitLength.meters)
h1 == h2 // true
h2 == h3 // true
let h = 6.ft
let h4 = h.in(.centimeters)
"\(h) = \(h4)" // 6.0 ft = 182.8800...002 cm
// ❌ 兩個測量值 (Measurement) 不能直接運算,看來使用起來限制不小。
// let hSqaured = h * h
// angle
let degrees = Measurement(value: 180, unit: UnitAngle.degrees)
let radians = degrees.converted(to: .radians)
let a = 180.deg
let a1 = a.in(.radians)
"\(a) = \(a1)" // 180.0° = 3.1415...9798 rad
// area
let squareMeters = Measurement(value: 4, unit: UnitArea.squareMeters)
let squareCentimeters = squareMeters.converted(to: .squareCentimeters)
let b = 4.m²
let b2 = b.in(.squareCentimeters)
"\(b) = \(b2)" // 4.0 m² = 40000.0 cm²
// volumn
let bushels = Measurement(value: 6, unit: UnitVolume.bushels)
let teaspoons = bushels.converted(to: .imperialTeaspoons)
定義
struct Measurement<UnitType: Unit>
Last updated
Was this helpful?