美文网首页
Measurements and Units

Measurements and Units

作者: coderzcj | 来源:发表于2016-08-03 12:19 被阅读23次

    一、相关类

    Dimension 是units的分类。比如长度,时间,速度。
    长度:km,m,ft,mi,etc
    有一个默认的基本单位:let meter = UnitLength.baseUnit
    可以转换单位 km <=>ft, m <=> mi

    dimension.png
    // Measurement
    
    public struct Measurement<UnitType : Unit> : Comparable, Equatable { 
        public let unit: UnitType 
        public var value: Double 
        public init(value: Double, unit: UnitType)
    }
    
    // Calculations With Measurements
    
     let distanceTraveled = Measurement(value: 5, unit: UnitLength.feet)
     let distanceToGo = Measurement(value: 6, unit: UnitLength.feet)
     let totalDistance = distanceTraveled + distanceToGo
    
    // Unit
    
    public class Unit : NSObject, NSCopying { 
        public let symbol : String 
        public init(symbol: String)
    }
    
    // Dimension
    
    public class Dimension : Unit, NSCoding { 
        public var converter : UnitConverter { get } 
        public init(symbol: String, converter: UnitConverter)
        public class var baseUnit : Dimension
    }
    
    public class UnitLength : Dimension {/*
         Base unit - meters */
         public class var kilometers: UnitLength { get }
         public class var meters: UnitLength { get }
         public class var feet: UnitLength { get }
         public class var miles: UnitLength { get }
    ...}
    

    二、自定义单位

    单位转换: baseUnit <=>unit

    • UnitConverter

    • baseUnitValue(fromValue value:)

    • value(fromBaseUnitValue baseUnitValue:)

    • UnitConverterLinear

    • baseUnitValue = value * coefficient + constant

    • value = (baseUnitValue - constant)/coefficient

    // “Jammin’ in the Streetz” Game - Custom Units
     
    let jamz = UnitDuration(symbol: “jamz", converter: UnitConverterLinear(coefficient: 30))
    let hopz = UnitLength(symbol: “hopz", converter: UnitConverterLinear(coefficient: 0.75))
    let glidez = UnitLength(symbol: “glidez", converter: UnitConverterLinear(coefficient: 1.5))
    
    
    // “Jammin’ in the Streetz” Game - Custom Dimension
    
    238_MeasurementsAndUnits_Final.key
    
    public class UnitDanceMove : Dimension {
        static let wackyArmMovements = UnitDanceMove(symbol: "💪",converter: UnitConverterLinear(coefficient: 1))
        static let robot = UnitDanceMove(symbol: "🤖",converter: UnitConverterLinear(coefficient: 4))
        static let cabbagePatch = UnitDanceMove(symbol: "👼", converter: UnitConverterLinear(coefficient: 3))
        static let jazzHands = UnitDanceMove(symbol: "👐",converter: UnitConverterLinear(coefficient: 2))
    }
    
    // “Jammin’ in the Streetz” Game - Jam Session
    
    public struct JamSession { 
        public var stepsTaken : Measurement<UnitLength> 
        public var jamTime : Measurement<UnitDuration> 
        public var danceMoves : Measurement<UnitDanceMove> 
        public var danceRate : Measurement<UnitSpeed> {
           let stepsInMeters = stepsTaken.converted(to: .meters) 
           let jamTimeInSeconds = jamTime.converted(to: .seconds) 
           return Measurement(value: (stepsInMeters.value / jamTimeInSeconds.value),
          }
    }
    

    三、格式化

    unit options.png
    // MeasurementFormatter
    
    public class MeasurementFormatter : Formatter, NSSecureCoding { 
        public var unitOptions: MeasurementFormatter.UnitOptions 
        public var unitStyle: Formatter.UnitStyle 
        @NSCopying public var locale: Locale!
        @NSCopying public var numberFormatter: NumberFormatter! 
        public func string(from measurement: Measurement<Unit>) -> String
        public func string(from unit: Unit) -> String
    }
    
    // 1.系统实现的单位,结果为系统符号
    let formatter = MeasurementFormatter()
    let distance = Measurement(value: 5, unit: UnitLength.kilometers)
    let result = formatter.string(from: distance)
    
    // 2.自定义系统实现的单位,结果为系统符号
    let hopz = UnitLength(symbol: “hopz", converter: UnitConverterLinear(coefficient: 0.75))
    let hopzDistance = Measurement(value: 1000, unit: hope)
    let resultingHopz = formatter.string(from: hopzDistance)
    
    // 3.自定义系统实现的单位,设置unitOptions,结果为自定义符号
    formatter.unitOptions = [.providedUnit]
    let hopzDistance = Measurement(value: 1000, unit: hope)
    let resultingHopz = formatter.string(from: hopzDistance)
    
    // 4.完全自定义单位,结果为自定义符号
    let robotDance = Measurement(value: 30, unit: UnitDanceMove.robot)
    let resultingRobotDances = formatter.string(from: robotDance)
    

    相关文章

      网友评论

          本文标题:Measurements and Units

          本文链接:https://www.haomeiwen.com/subject/pzuqsttx.html