2016-11-15 5 views
2

Measurementクラスからswift 3のクラスを派生させたいので、各測定の "Imperial"と "Metric"デフォルト単位を定義する追加機能を追加できます。これはどうすればいいですか?以下は、私がどのように始めたかです。SwiftのMeasurementからクラスを派生させる方法

enum UnitOptions { case imperial, metric } 

class CustomMeasurement : Measurement { 

    let imperialUnit: Unit 
    let metricUnit: Unit 
    let inputMeasurement = Measurement<Unit> 

    init(value: Double, inputUnit: Unit, imperialUnit: Unit, metricUnit: Unit) { 
     self.imperialUnit = imperialUnit 
     self.metricUnit = metricUnit 

     inputMeasurement = Measurement<Unit>(value: value, unit: inputUnit) 
    } 

    func getMeasurement(unitSystem: UnitOptions) { 
     if (unitSystem == .imperial) { 
      return inputMeasurement.converted(to: imperialUnit) 
     } else { 
      return inputMeasurement.converted(to: metricUnit) 
     } 
    } 
} 

答えて

3

拡張機能を作成します。ここでやったことは、実際にはサブクラスを定義することです。 Measurementは実際にはModelTypeであり、クラスhttps://developer.apple.com/reference/foundation/measurementではありません(ただし、Swift ModelTypesがクラスのタイプであれば100%は分かりませんので、問題はありません)。

しかし、質問に答えるには、実際にコンバージョンを行うタイプのものがたくさんあるので、あなたが求めていることを厳密に行う必要はありません。 Centimetersの帝国版は何ですか?それはインチですか、または足ですか?ミリメートルの帝国バージョンは何ですか?任意の拡張子なし

、ここで何ができるかです:

let testInch : Measurement = Measurement(value: 25, unit: UnitLength.inches) 
let testCM : Measurement = Measurement(value: 10, unit: UnitLength.centimeters) 
var testInMetres = (testInch + testCM).converted(to: UnitLength.meters) 

は、任意のペナルティなしなど、それらを引く、そしてあなたが追加することができ、ユニットで、測定として物事を定義して、ちょうどあなたのようにそれらを使用します後のように。

あなたが「帝国」タイプを持つようにしたい場合は、私はこのような何かしたい:私たちは、新しいタイプの「帝国」を含めるように単位長タイプを拡張

extension UnitLength { 
    static var imperial: UnitLength { 
     switch self.baseUnit() { 
     case centimeters: 
      return UnitLength.inches 
     case meters: 
      return UnitLength.feet 
     default: 
      return UnitLength.inches 
     } 
    } 
} 

を。それはセンチメートルの場合はベースタイプをチェックし、タイプがインチの場合はメーター、フィートの場合はデフォルト、インチの場合はデフォルトを返します。あなたは好きなようにここで "Imperial"のためのあらゆる種類のUnitTypesのカスタム処理を定義することができます。このよう

はそれを使用してください:私は前に測定を使用していない

testInMetres.convert(to: UnitLength.imperial) // Returns length in feet. 

、この記事では、背景として本当に便利でした。 https://oleb.net/blog/2016/07/measurements-and-units/

0

私はスレッドに遅れていますが、別の方法では、サブクラス(またはあなたのケースでは多くのサブクラス)をDimensionに拡張することをお勧めします。

extension UnitSpeed { 
    @nonobjc static let mmPerHour = UnitSpeed(symbol: "mm/hr", converter: UnitConverterLinear(coefficient: 1000.0*3600.0)) 
} 

あなたが代わりに変数@nonobjc static let imperial = milesPerHourを追加することができます。たとえば、ここにあなたがUnitSpeedクラスに新しいユニット、MM /時間を追加する方法です。 の詳細情報

関連する問題